<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>GitHub Dockerfile Monthly Trending</title>
    <description>Monthly Trending of Dockerfile in GitHub</description>
    <pubDate>Thu, 16 Jul 2026 01:53:27 GMT</pubDate>
    <link>http://mshibanami.github.io/GitHubTrendingRSS</link>
    
    <item>
      <title>freeCodeCamp/rdb-alpha</title>
      <link>https://github.com/freeCodeCamp/rdb-alpha</link>
      <description>&lt;h3&gt;Prerequisites&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.docker.com/engine/&quot;&gt;Docker Engine&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/download&quot;&gt;VS Code&lt;/a&gt; and the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers&quot;&gt;Dev Containers&lt;/a&gt; extension&lt;/li&gt; 
 &lt;li&gt;Git&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;How to Run a Project in Docker&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;Clone the RDB Alpha repo with &lt;code&gt;git clone https://github.com/freeCodeCamp/rdb-alpha&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Open a terminal, navigate to the &lt;code&gt;rdb-alpha&lt;/code&gt; directory, and open VSCode with &lt;code&gt;code .&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Press Ctrl / Cmd + Shift + P and enter &lt;code&gt;Dev Containers: Rebuild Container and Reopen in Container&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;A new VS Code window will open and begin building the Docker image. It will take several minutes to build the first time.&lt;/li&gt; 
 &lt;li&gt;Once the image is finished building, press Ctrl / Cmd + Shift + P and enter &lt;code&gt;CodeRoad: Start&lt;/code&gt; to open CodeRoad&lt;/li&gt; 
 &lt;li&gt;In the CodeRoad window, click &quot;Start New Tutorial&quot;&lt;/li&gt; 
 &lt;li&gt;Enter the URL to the &lt;code&gt;tutorial.json&lt;/code&gt; file of the project you want to start (ex: &lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-bash-by-building-a-boilerplate/main/tutorial.json&quot;&gt;https://raw.githubusercontent.com/freeCodeCamp/learn-bash-by-building-a-boilerplate/main/tutorial.json&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;Click the &quot;Start&quot; button&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;There may be some additional troubleshooting steps to get the container running properly. They can often be solved by following the onscreen instructions, or examining any error messages in your terminal.&lt;/p&gt; 
&lt;h3&gt;How to Restart or Switch Projects&lt;/h3&gt; 
&lt;p&gt;Note: If you restart or switch projects you will lose your progress, along with any files or directories you created.&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Press Ctrl / Cmd + Shift + P and enter &lt;code&gt;Dev Containers: Rebuild Container&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Wait for VS Code to reopen and reload the Docker container&lt;/li&gt; 
 &lt;li&gt;Open CodeRoad, enter the URL to a &lt;code&gt;tutorial.json&lt;/code&gt; file, and start the project as described above&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;&lt;code&gt;tutorial.json&lt;/code&gt; File URLs for CodeRoad&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-bash-by-building-a-boilerplate/main/tutorial.json&quot;&gt;Learn Bash by Building a Boilerplate&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-relational-databases-by-building-a-database-of-video-game-characters/main/tutorial.json&quot;&gt;Learn Relational Databases by Building a Database of Video Game Characters&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-celestial-bodies-database/main/tutorial.json&quot;&gt;Celestial Bodies Database&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-bash-scripting-by-building-five-programs/main/tutorial.json&quot;&gt;Learn Bash Scripting by Building Five Programs&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-sql-by-building-a-student-database-part-1/main/tutorial.json&quot;&gt;Learn SQL by Building a Student Database: Part 1&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-sql-by-building-a-student-database-part-2/main/tutorial.json&quot;&gt;Learn SQL by Building a Student Database: Part 2&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-world-cup-database/main/tutorial.json&quot;&gt;World Cup Database&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-advanced-bash-by-building-a-kitty-ipsum-translator/main/tutorial.json&quot;&gt;Learn Advanced Bash by Building a Kitty Ipsum Translator&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-bash-and-sql-by-building-a-bike-rental-shop/main/tutorial.json&quot;&gt;Learn Bash and SQL by Building a Bike Rental Shop&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-salon-appointment-scheduler/main/tutorial.json&quot;&gt;Salon Appointment Scheduler&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-nano-by-building-a-castle/main/tutorial.json&quot;&gt;Learn Nano by Building a Castle&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-git-by-building-an-sql-reference-object/main/tutorial.json&quot;&gt;Learn Git by Building an SQL Reference Object&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-periodic-table-database/main/tutorial.json&quot;&gt;Periodic Table Database&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/freeCodeCamp/learn-number-guessing-game/main/tutorial.json&quot;&gt;Number Guessing Game&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/5c219e4af4825db441637ee9f4130ed465ee961b9643fd5a112ffc3ce0a3a056/freeCodeCamp/rdb-alpha" medium="image" />
      
    </item>
    
    <item>
      <title>kagisearch/kagi-docs</title>
      <link>https://github.com/kagisearch/kagi-docs</link>
      <description>&lt;p&gt;Documentation for products made by Kagi Inc&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Kagi Inc. Documentation&lt;/h1&gt; 
&lt;p&gt;This repository contains open-source documentation for products made by Kagi Inc.&lt;/p&gt; 
&lt;h2&gt;Contents&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/kagisearch/kagi-docs/main/#knowledgebase-map&quot;&gt;Knowledgebase Map&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/kagisearch/kagi-docs/main/#support&quot;&gt;Support&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/kagisearch/kagi-docs/main/#discussions&quot;&gt;Discussions&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/kagisearch/kagi-docs/main/#community&quot;&gt;Community&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/kagisearch/kagi-docs/main/#contributing&quot;&gt;Contributing&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/kagisearch/kagi-docs/main/#issues&quot;&gt;Issues&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/kagisearch/kagi-docs/main/#pull-requests&quot;&gt;Pull Requests&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/kagisearch/kagi-docs/main/#creating-a-pull-request&quot;&gt;Creating a Pull Request&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/kagisearch/kagi-docs/main/#building&quot;&gt;Building&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Knowledgebase Map&lt;/h2&gt; 
&lt;p&gt;This repo serves documentation for multiple products developed by Kagi.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Product&lt;/th&gt; 
   &lt;th&gt;Documentation&lt;/th&gt; 
   &lt;th&gt;Repo Directory&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://kagi.com&quot;&gt;Kagi Search&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://help.kagi.com/kagi&quot;&gt;https://help.kagi.com/kagi&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/kagisearch/kagi-docs/tree/main/docs/kagi&quot;&gt;kagi&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://browser.kagi.com&quot;&gt;Orion Browser&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://help.kagi.com/orion&quot;&gt;https://help.kagi.com/orion&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/kagisearch/kagi-docs/tree/main/docs/orion&quot;&gt;orion&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Our documentation efforts are ongoing! We welcome your feedback and contributions - read on for details!&lt;/p&gt; 
&lt;h2&gt;Support&lt;/h2&gt; 
&lt;h3&gt;Discussions&lt;/h3&gt; 
&lt;p&gt;On our &lt;a href=&quot;https://github.com/kagisearch/kagi-docs/discussions&quot;&gt;discussions&lt;/a&gt; page, you will find several categories:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Announcements&lt;/strong&gt;, where we will post important updates related to the documentation in this repo.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Q&amp;amp;A&lt;/strong&gt;, where you can discuss and ask questions about the documentation and APIs that we offer. This is the best place to start if you&#39;re not sure of a better place!&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;For topics outside of the documentation &amp;amp; APIs, please refer to that product&#39;s official support venues, in the &lt;a href=&quot;https://raw.githubusercontent.com/kagisearch/kagi-docs/main/#community&quot;&gt;Community&lt;/a&gt; section.&lt;/p&gt; 
&lt;h3&gt;Community&lt;/h3&gt; 
&lt;p&gt;Each of our products has their own forum, and we encourage you to join us there. We also have a shared Discord server where you can discuss all of our products.&lt;/p&gt; 
&lt;p&gt;Discord Invite: &lt;a href=&quot;https://kagi.com/discord&quot;&gt;https://kagi.com/discord&lt;/a&gt;&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Product&lt;/th&gt; 
   &lt;th&gt;Feedback &amp;amp; Bug Reports&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Kagi Search&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://kagifeedback.org&quot;&gt;kagifeedback.org&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Orion Browser&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://orionfeedback.org&quot;&gt;orionfeedback.org&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;h3&gt;Issues&lt;/h3&gt; 
&lt;p&gt;We welcome any bug reports, requests for clarification, or other inquiries via the &lt;a href=&quot;https://github.com/kagisearch/kagi-docs/issues&quot;&gt;Issues&lt;/a&gt; tab.&lt;/p&gt; 
&lt;p&gt;Upon opening an issue, you will be presented with a list of templates to choose from that will help you provide us with the information we need, and triage the issue with the correct labels.&lt;/p&gt; 
&lt;p&gt;A staff member will review your issue, and help investigate what the best course of action is.&lt;/p&gt; 
&lt;h3&gt;Pull Requests&lt;/h3&gt; 
&lt;p&gt;Thank you for taking the time to contribute!&lt;/p&gt; 
&lt;p&gt;We welcome contributions such as:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Fixes to incorrect statements or inaccuracies within the documentation.&lt;/li&gt; 
 &lt;li&gt;Extending documentation with details, or clarifying complicated explanations with easier to understand wording.&lt;/li&gt; 
 &lt;li&gt;Additions that fill gaps or missing pieces in the current documentation.&lt;/li&gt; 
 &lt;li&gt;Fixing of spelling and grammatical errors in the documentation.&lt;/li&gt; 
 &lt;li&gt;Adding new documentation when staff calls on the community to prepare new sections.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;We would ask that you withhold:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Whitespace or formatting changes.&lt;/li&gt; 
 &lt;li&gt;Subjective wording changes.&lt;/li&gt; 
 &lt;li&gt;Modifications to the overall structure and format of the documentation.&lt;/li&gt; 
 &lt;li&gt;Additions needlessly restructure current documentation.&lt;/li&gt; 
 &lt;li&gt;Additions that document unreleased product functionality.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;If you are not sure, please feel free to &lt;a href=&quot;https://github.com/kagisearch/kagi-docs/issues/new/choose&quot;&gt;open an issue&lt;/a&gt; first, and we will help guide you along!&lt;/p&gt; 
&lt;h3&gt;Creating a Pull Request&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/kagisearch/kagi-docs/fork&quot;&gt;Create a fork&lt;/a&gt; of this repo&lt;/li&gt; 
 &lt;li&gt;Create a branch: &lt;code&gt;git checkout -b username/my-cool-change&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Follow the &lt;a href=&quot;https://raw.githubusercontent.com/kagisearch/kagi-docs/main/#building&quot;&gt;Building&lt;/a&gt; instructions to compile the book you would like to change&lt;/li&gt; 
 &lt;li&gt;Make your changes&lt;/li&gt; 
 &lt;li&gt;Commit your changes: &lt;code&gt;git -am &#39;Update documentation&#39;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Push the branch to your fork: &lt;code&gt;git push origin username/my-cool-change&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Create a new Pull Request&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;A template in the pull request form will guide you in providing any additional details we need to help accept your changes.&lt;/p&gt; 
&lt;h2&gt;Building&lt;/h2&gt; 
&lt;p&gt;Kagi&#39;s docs generated by &lt;a href=&quot;https://vitepress.dev/&quot;&gt;Vitepress&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Development on your localhost&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;npm install
npm run docs:dev
&lt;/code&gt;&lt;/pre&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/458cc4f3c6063024b7dfe8ca4b7c4a530471efe999eded341e9147dffafd9d16/kagisearch/kagi-docs" medium="image" />
      
    </item>
    
    <item>
      <title>vulhub/vulhub</title>
      <link>https://github.com/vulhub/vulhub</link>
      <description>&lt;p&gt;Pre-Built Vulnerable Environments Based on Docker-Compose&lt;/p&gt;&lt;hr&gt;&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://vulhub.org&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/vulhub/vulhub/master/.github/assets/banner.png&quot; alt=&quot;Vulhub&quot; height=&quot;auto&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://discord.gg/bQCpZEK&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/discord/485505185167179778.svg?sanitize=true&quot; alt=&quot;Chat on Discord&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/sponsors/phith0n&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/sponsors/phith0n?color=aqua&quot; alt=&quot;GitHub Sponsors&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://vulhub.org/environments&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Vulnerabilities count&quot; src=&quot;https://img.shields.io/badge/dynamic/json?url=https://vulhub.org/api/statistic&amp;amp;query=%24.environments&amp;amp;label=vulnerabilities&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;GitHub language count&quot; src=&quot;https://img.shields.io/github/languages/count/vulhub/vulhub?color=yellow&quot; /&gt; &lt;a href=&quot;https://github.com/vulhub/vulhub/graphs/contributors&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;GitHub contributors&quot; src=&quot;https://img.shields.io/github/contributors-anon/vulhub/vulhub?color=orange&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/vulhub/vulhub/raw/master/LICENSE&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/license/vulhub/vulhub.svg?sanitize=true&quot; alt=&quot;GitHub&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p&gt;Vulhub is an open-source collection of pre-built, ready-to-use vulnerable Docker environments. With just one command you can launch a vulnerable environment for security research, learning, or demonstration, no prior Docker experience required.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/vulhub/vulhub/master/README.zh-cn.md&quot;&gt;中文版本(Chinese version)&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Quick Start&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Install Docker&lt;/strong&gt; (example for Ubuntu 24.04):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Install the latest version docker
curl -s https://get.docker.com/ | sh

# Run docker service
systemctl start docker
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For other operating systems, see the &lt;a href=&quot;https://docs.docker.com/&quot;&gt;Docker documentation&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Although all Vulhub environments are running based on Docker Compose, you no longer need to install docker-compose separately. Instead, you can use the built-in &lt;code&gt;docker compose&lt;/code&gt; command to start Vulhub environments.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Download and set up Vulhub:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone --depth 1 https://github.com/vulhub/vulhub
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Launch a vulnerable environment:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd vulhub/langflow/CVE-2025-3248  # Example: enter a vulnerability directory
docker compose up -d
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Each environment directory contains a detailed &lt;strong&gt;README&lt;/strong&gt; with reproduction steps and usage instructions.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Clean up after testing:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose down -v
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Use a VPS or VM with at least 1GB RAM for best results&lt;/li&gt; 
  &lt;li&gt;The &lt;code&gt;your-ip&lt;/code&gt; in documentation refers to your host/VPS IP, not the Docker container IP&lt;/li&gt; 
  &lt;li&gt;Ensure Docker has permission to access all files in the current directory to avoid permission errors&lt;/li&gt; 
  &lt;li&gt;Some environments may not support ARM architectures, see &lt;a href=&quot;https://raw.githubusercontent.com/vulhub/vulhub/master/#troubleshooting&quot;&gt;Troubleshooting&lt;/a&gt; for details&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;All environments are for testing and educational purposes only. Do not use in production!&lt;/strong&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/div&gt; 
&lt;h2&gt;Troubleshooting&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Docker image pull fails in mainland China&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Docker Hub may be inaccessible from mainland China. Use a registry mirror or run Vulhub on an overseas VPS.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Environments fail to start on Apple Silicon (M-series) Macs&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Most Vulhub environments run natively on Docker Desktop for Mac with M-series chips. If an environment fails, try setting the platform explicitly:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export DOCKER_DEFAULT_PLATFORM=linux/amd64
docker compose up -d
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Environments fail on Kali Linux&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Some environments may fail on Kali Linux due to a low &lt;code&gt;ulimit nofile&lt;/code&gt; setting. See the &lt;a href=&quot;https://vulhub.org/documentation/faq&quot;&gt;FAQ&lt;/a&gt; for the fix.&lt;/p&gt; 
&lt;p&gt;If you encounter issues that you cannot resolve, feel free to seek help from the community:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://discord.gg/bQCpZEK&quot;&gt;Discord&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://x.com/vulhub&quot;&gt;X (Twitter)&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;We welcome contributions! Please read our &lt;a href=&quot;https://raw.githubusercontent.com/vulhub/vulhub/master/CONTRIBUTING.md&quot;&gt;Contributing Guide&lt;/a&gt; to get started.&lt;/p&gt; 
&lt;p&gt;Thanks to all contributors:&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/vulhub/vulhub/graphs/contributors&quot;&gt;&lt;img src=&quot;https://opencollective.com/vulhub/contributors.svg?width=890&amp;amp;button=false&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Partners&lt;/h2&gt; 
&lt;p&gt;Our partners and users:&lt;/p&gt; 
&lt;p&gt; &lt;a href=&quot;https://www.wangan.com/vulhub&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://vulhub.org/sponsor/wangan.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.cvebase.com&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://vulhub.org/sponsor/cvebase.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.huoxian.cn&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://vulhub.org/sponsor/huoxian.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.chaitin.cn&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://vulhub.org/sponsor/chaitin.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://xianzhi.aliyun.com/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://vulhub.org/sponsor/aliyun.svg?sanitize=true&quot; width=&quot;200&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p&gt;Sponsor Vulhub on &lt;a href=&quot;https://github.com/sponsors/phith0n&quot;&gt;GitHub Sponsor&lt;/a&gt;, &lt;a href=&quot;https://opencollective.com/vulhub#backer&quot;&gt;OpenCollective&lt;/a&gt;, or &lt;a href=&quot;https://www.patreon.com/bePatron?u=12677520&quot;&gt;Patreon&lt;/a&gt; 🙏&lt;/p&gt; 
&lt;p&gt; &lt;a href=&quot;https://github.com/sponsors/phith0n&quot;&gt;&lt;img src=&quot;https://opencollective.com/vulhub/backers.svg?width=138&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/sponsors/phith0n&quot;&gt;&lt;img src=&quot;https://opencollective.com/vulhub/sponsors.svg?width=138&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p&gt;More ways to &lt;a href=&quot;https://vulhub.org/&quot;&gt;donate&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;p&gt;Vulhub is licensed under the MIT License. See &lt;a href=&quot;https://raw.githubusercontent.com/vulhub/vulhub/master/LICENSE&quot;&gt;LICENSE&lt;/a&gt; for details.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/e4ccc52f55fa30483be313aa4344f7ab23599ab8b6ded6a6d1f62b321d06fbb4/vulhub/vulhub" medium="image" />
      
    </item>
    
    <item>
      <title>redhat-openshift-ecosystem/community-operators-prod</title>
      <link>https://github.com/redhat-openshift-ecosystem/community-operators-prod</link>
      <description>&lt;p&gt;community-operators metadata backing OpenShift OperatorHub&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Openshift Community Operators&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0.html&quot;&gt;&lt;img src=&quot;http://img.shields.io/:license-apache-blue.svg?sanitize=true&quot; alt=&quot;License&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;About this repository&lt;/h2&gt; 
&lt;p&gt;This repo is the canonical source for Kubernetes Operators that appear on &lt;a href=&quot;https://openshift.com&quot;&gt;OpenShift Container Platform&lt;/a&gt; and &lt;a href=&quot;https://www.okd.io/&quot;&gt;OKD&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt; The index catalog &lt;code&gt;registry.redhat.io/redhat/community-operator-index:v&amp;lt;OCP Version&amp;gt;&lt;/code&gt; is built from this repository and it is consumed by Openshift and OKD to create their sources and built their catalog. To know more about how Openshift catalog are built see the &lt;a href=&quot;https://docs.openshift.com/container-platform/4.14/operators/understanding/olm-rh-catalogs.html#olm-rh-catalogs_olm-rh-catalogs&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;See our &lt;a href=&quot;https://redhat-openshift-ecosystem.github.io/operator-pipelines/&quot;&gt;documentation&lt;/a&gt; to find out more about Community operators and contribution.&lt;/p&gt; 
&lt;h2&gt;Add your Operator&lt;/h2&gt; 
&lt;p&gt;We would love to see your Operator added to this collection. We currently use automated vetting via continuous integration plus manual review to curate a list of high-quality, well-documented Operators. If you are new to Kubernetes Operators start &lt;a href=&quot;https://sdk.operatorframework.io/build/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Contributing Guide&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redhat-openshift-ecosystem.github.io/operator-pipelines/users/contributing-prerequisites/&quot;&gt;Prerequisites&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redhat-openshift-ecosystem.github.io/operator-pipelines/users/contributing-where-to/&quot;&gt;Where to place operator&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redhat-openshift-ecosystem.github.io/operator-pipelines/users/contributing-via-pr/&quot;&gt;Creating pull request (PR)&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redhat-openshift-ecosystem.github.io/operator-pipelines/users/operator-ci-yaml/&quot;&gt;Operator Publishing / Review settings&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redhat-openshift-ecosystem.github.io/operator-pipelines/users/packaging-required-criteria-ocp/&quot;&gt;OKD/OpenShift Catalogs criteria and options&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;IMPORTANT NOTICE&lt;/h2&gt; 
&lt;p&gt;Some APIs versions are deprecated and are OR will no longer be served. See &lt;a href=&quot;https://redhat-openshift-ecosystem.github.io/operator-pipelines/#important-notice&quot;&gt;https://redhat-openshift-ecosystem.github.io/operator-pipelines/#important-notice&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Reporting Bugs&lt;/h2&gt; 
&lt;p&gt;Use the issue tracker in this repository to report bugs.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/b24ecc750aaeecf2434badbd0678a6674b7f075ebbf27452cc2e53e313f3ff4b/redhat-openshift-ecosystem/community-operators-prod" medium="image" />
      
    </item>
    
    <item>
      <title>yankils/Simple-DevOps-Project</title>
      <link>https://github.com/yankils/Simple-DevOps-Project</link>
      <description>&lt;h1&gt;Simple DevOps Project&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.udemy.com/course/valaxy-devops/?referralCode=8147A5CF4C8C7D9E253F&quot;&gt;&lt;img src=&quot;https://github.com/yankils/Simple-DevOps-Project/raw/master/Devops_course.PNG&quot; alt=&quot;Image&quot; title=&quot;DevOps Project - CI/CD with Jenkins Ansible Docker Kubernetes &quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;This Repository is a collection of Implementation documents.&lt;/p&gt; 
&lt;h3&gt;Purpose:&lt;/h3&gt; 
&lt;p&gt;By following this repository you can able to setup a DevOps CI/CD Pipeline using&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;git&lt;/li&gt; 
 &lt;li&gt;Jenkins&lt;/li&gt; 
 &lt;li&gt;Maven&lt;/li&gt; 
 &lt;li&gt;Ansible&lt;/li&gt; 
 &lt;li&gt;Docker &amp;amp;&lt;/li&gt; 
 &lt;li&gt;Kubernetes&lt;/li&gt; 
&lt;/ul&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/45c30d93b62120e3feaf0bee749faaa17d84d29916565113983d8bf3ad3196fb/yankils/Simple-DevOps-Project" medium="image" />
      
    </item>
    
    <item>
      <title>redhat-openshift-ecosystem/certified-operators</title>
      <link>https://github.com/redhat-openshift-ecosystem/certified-operators</link>
      <description>&lt;p&gt;Production catalog for Red Hat Certified Operator Bundles&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Red Hat certified operators production catalog&lt;/h1&gt; 
&lt;p&gt;Production catalog for Red Hat Certified Operator Bundles&lt;/p&gt; 
&lt;p&gt;See our &lt;a href=&quot;https://redhat-openshift-ecosystem.github.io/operator-pipelines/&quot;&gt;documentation&lt;/a&gt; to find out more about Certified operators and contribution.&lt;/p&gt; 
&lt;h1&gt;Operator bundle submission&lt;/h1&gt; 
&lt;p&gt;A new operator bundle submission needs to follow a predefined directory structure that is described below in this section. The new submission is done through Github pull requests which can be either open by the &lt;a href=&quot;https://github.com/redhat-openshift-ecosystem/operator-pipelines&quot;&gt;CI pipeline&lt;/a&gt; or manually by a user. The recommended way is to use the CI pipeline because it makes sure all necessary data are provided in the correct format. Documentation about how to use the pipeline is available in the pipeline repository.&lt;/p&gt; 
&lt;h2&gt;Pull request&lt;/h2&gt; 
&lt;p&gt;A pull request with a new operator bundle needs to follow given rules to pass a tests:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Title format: &lt;code&gt;operator package-name (version)&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Pull request can only modify one operator&lt;/li&gt; 
 &lt;li&gt;Pull request can&#39;t modify already merged operators&lt;/li&gt; 
 &lt;li&gt;Associated images need to be pinned to specific image digest - tags are not allowed&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Rules mentioned above are always followed when pull request is opened using CI pipeline.&lt;/p&gt; 
&lt;h2&gt;Directory structure&lt;/h2&gt; 
&lt;p&gt;This repository contains an &lt;code&gt;operator&lt;/code&gt; directory where all certified operators are stored. Each operator has its directory with its package name. Inside the directory, you have to provide a &lt;code&gt;ci.yaml&lt;/code&gt; file that stores the necessary metadata for a successful certification process. The format of the file is described below.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;operators
└── kogito-operator
    ├── 1.6.0
    │&amp;nbsp;&amp;nbsp; ├── manifests
    │&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── app.kiegroup.org_kogitobuilds.yaml
    │&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── app.kiegroup.org_kogitoinfras.yaml
    │&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── app.kiegroup.org_kogitoruntimes.yaml
    │&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── app.kiegroup.org_kogitosupportingservices.yaml
    │&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── kogito-operator.clusterserviceversion.yaml
    │&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── kogito-operator-controller-manager_v1_serviceaccount.yaml
    │&amp;nbsp;&amp;nbsp; └── metadata
    │&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp; └── annotations.yaml
    └── ci.yaml
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Format of ci.yaml file&lt;/h3&gt; 
&lt;p&gt;In the file, user needs to provide necessary details for the operator certification process. Currently, the certification process supports the following options:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;cert_project_id&lt;/code&gt; - Identifier of certification project created through Red Hat Connect.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;merge&lt;/code&gt; - A boolean value that determines whether a new operator is automatically merged when passed all required checks. (optional, default: &lt;code&gt;True&lt;/code&gt;)&lt;/li&gt; 
&lt;/ul&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/421b4c2041ffb8851a498b2cfd774b1bd806dfae35d9acbc11fd1b24ab7097b6/redhat-openshift-ecosystem/certified-operators" medium="image" />
      
    </item>
    
    <item>
      <title>goldbergyoni/nodebestpractices</title>
      <link>https://github.com/goldbergyoni/nodebestpractices</link>
      <description>&lt;p&gt;✅ The Node.js best practices list (July 2026)&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Node.js Best Practices&lt;/h1&gt; 
&lt;h1 align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/banner-2.jpg&quot; alt=&quot;Node.js Best Practices&quot; /&gt; &lt;/h1&gt; 
&lt;br /&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;img src=&quot;https://img.shields.io/badge/%E2%9A%99%2520Item%2520count%2520-%2520102%2520Best%2520Practices-blue.svg?sanitize=true&quot; alt=&quot;102 items&quot; /&gt; 
 &lt;img id=&quot;last-update-badge&quot; src=&quot;https://img.shields.io/badge/%F0%9F%93%85%20Last%20update%20-%20January%2024%2C%202023-green.svg?sanitize=true&quot; alt=&quot;Last update: January 3rd, 2024&quot; /&gt; 
 &lt;img src=&quot;https://img.shields.io/badge/%20%25E2%259C%2594%2520Updated%2520For%2520Version%2520-%2520Node%252022.0.0-brightgreen.svg?sanitize=true&quot; alt=&quot;Updated for Node 22.0.0&quot; /&gt; 
&lt;/div&gt; 
&lt;br /&gt; 
&lt;p&gt;&lt;a href=&quot;https://twitter.com/nodepractices/&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/twitter.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;strong&gt;Follow us on Twitter!&lt;/strong&gt; &lt;a href=&quot;https://twitter.com/nodepractices/&quot;&gt;&lt;strong&gt;@nodepractices&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;br /&gt; 
&lt;p&gt;Read in a different language: &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.chinese.md&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/CN.png&quot; alt=&quot;CN&quot; /&gt;&lt;strong&gt;CN&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.french.md&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/FR.png&quot; alt=&quot;FR&quot; /&gt;&lt;strong&gt;FR&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.brazilian-portuguese.md&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/BR.png&quot; alt=&quot;BR&quot; /&gt;&lt;strong&gt;BR&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.russian.md&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/RU.png&quot; alt=&quot;RU&quot; /&gt;&lt;strong&gt;RU&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.polish.md&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/PL.png&quot; alt=&quot;PL&quot; /&gt;&lt;strong&gt;PL&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.japanese.md&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/JA.png&quot; alt=&quot;JA&quot; /&gt;&lt;strong&gt;JA&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.basque.md&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/EU.png&quot; alt=&quot;EU&quot; /&gt;&lt;strong&gt;EU&lt;/strong&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translations&quot;&gt;(&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/ES.png&quot; alt=&quot;ES&quot; /&gt;&lt;strong&gt;ES&lt;/strong&gt;, &lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/HE.png&quot; alt=&quot;HE&quot; /&gt;&lt;strong&gt;HE&lt;/strong&gt;, &lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/KR.png&quot; alt=&quot;KR&quot; /&gt;&lt;strong&gt;KR&lt;/strong&gt; and &lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/TR.png&quot; alt=&quot;TR&quot; /&gt;&lt;strong&gt;TR&lt;/strong&gt; in progress! )&lt;/a&gt;&lt;/p&gt; 
&lt;br /&gt; 
&lt;h1&gt;🎊 2026 edition is here!&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;🛰 Modernized to 2026&lt;/strong&gt;: Tons of text edits, new recommended libraries, and some new best practices&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;✨ Easily focus on new content&lt;/strong&gt;: Already visited before? Search for &lt;code&gt;#new&lt;/code&gt; or &lt;code&gt;#updated&lt;/code&gt; tags for new content only&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔖 Curious to see examples? We have a starter&lt;/strong&gt;: Visit &lt;a href=&quot;https://github.com/practicajs/practica&quot;&gt;Practica.js&lt;/a&gt;, our application example and boilerplate (beta) to see some practices in action&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;Welcome! 3 Things You Ought To Know First&lt;/h1&gt; 
&lt;p&gt;&lt;strong&gt;1. You are reading dozens of the best Node.js articles -&lt;/strong&gt; this repository is a summary and curation of the top-ranked content on Node.js best practices, as well as content written here by collaborators&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;2. It is the largest compilation, and it is growing every week -&lt;/strong&gt; currently, more than 80 best practices, style guides, and architectural tips are presented. New issues and pull requests are created every day to keep this live book updated. We&#39;d love to see you contributing here, whether that is fixing code mistakes, helping with translations, or suggesting brilliant new ideas. See our &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/.operations/writing-guidelines.md&quot;&gt;writing guidelines here&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;3. Best practices have additional info -&lt;/strong&gt; most bullets include a &lt;strong&gt;🔗Read More&lt;/strong&gt; link that expands on the practice with code examples, quotes from selected blogs, and more information&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;By Yoni Goldberg&lt;/h1&gt; 
&lt;h3&gt;Learn with me: As a consultant, I engage with worldwide teams on various activities like workshops and code reviews. 🎉AND... Hold on, I&#39;ve just launched my &lt;a href=&quot;https://testjavascript.com/&quot;&gt;beyond-the-basics testing course, which is on a 🎁 limited-time sale&lt;/a&gt; until August 7th&lt;/h3&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Table of Contents&lt;/h2&gt; 
&lt;details&gt; 
 &lt;summary&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#1-project-architecture-practices&quot;&gt;1. Project Architecture Practices (6)&lt;/a&gt; &lt;/summary&gt; 
 &lt;p&gt;  &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-11-structure-your-solution-by-business-components&quot;&gt;1.1 Structure your solution by components &lt;code&gt;#strategic&lt;/code&gt; &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-12-layer-your-components-with-3-tiers-keep-the-web-layer-within-its-boundaries&quot;&gt;1.2 Layer your components, keep the web layer within its boundaries &lt;code&gt;#strategic&lt;/code&gt; &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-13-wrap-common-utilities-as-packages-consider-publishing&quot;&gt;1.3 Wrap common utilities as packages, consider publishing&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-14-use-environment-aware-secure-and-hierarchical-config&quot;&gt;1.4 Use environment aware, secure and hierarchical config &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-15-consider-all-the-consequences-when-choosing-the-main-framework&quot;&gt;1.5 Consider all the consequences when choosing the main framework &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-16-use-typescript-sparingly-and-thoughtfully&quot;&gt;1.6 Use TypeScript sparingly and thoughtfully &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#2-error-handling-practices&quot;&gt;2. Error Handling Practices (12)&lt;/a&gt; &lt;/summary&gt; 
 &lt;p&gt;  &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-21-use-async-await-or-promises-for-async-error-handling&quot;&gt;2.1 Use Async-Await or promises for async error handling&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-22-extend-the-built-in-error-object&quot;&gt;2.2 Extend the built-in Error object &lt;code&gt;#strategic&lt;/code&gt; &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-23-distinguish-catastrophic-errors-from-operational-errors&quot;&gt;2.3 Distinguish operational vs programmer errors &lt;code&gt;#strategic&lt;/code&gt; &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-24-handle-errors-centrally-not-within-a-middleware&quot;&gt;2.4 Handle errors centrally, not within a middleware &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-25-document-api-errors-using-openapi-or-graphql&quot;&gt;2.5 Document API errors using OpenAPI or GraphQL&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-26-exit-the-process-gracefully-when-a-stranger-comes-to-town&quot;&gt;2.6 Exit the process gracefully when a stranger comes to town &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-27-use-a-mature-logger-to-increase-errors-visibility&quot;&gt;2.7 Use a mature logger to increase errors visibility &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-28-test-error-flows-using-your-favorite-test-framework&quot;&gt;2.8 Test error flows using your favorite test framework &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-29-discover-errors-and-downtime-using-apm-products&quot;&gt;2.9 Discover errors and downtime using APM products&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-210-catch-unhandled-promise-rejections&quot;&gt;2.10 Catch unhandled promise rejections &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-211-fail-fast-validate-arguments-using-a-dedicated-library&quot;&gt;2.11 Fail fast, validate arguments using a dedicated library&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-212-always-await-promises-before-returning-to-avoid-a-partial-stacktrace&quot;&gt;2.12 Always await promises before returning to avoid a partial stacktrace &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-213-subscribe-to-event-emitters-and-streams-error-event&quot;&gt;2.13 Subscribe to event emitters &#39;error&#39; event &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#3-code-patterns-and-style-practices&quot;&gt;3. Code Style Practices (12)&lt;/a&gt; &lt;/summary&gt; 
 &lt;p&gt;  &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-31-use-eslint&quot;&gt;3.1 Use ESLint &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-32-use-nodejs-eslint-extension-plugins&quot;&gt;3.2 Use Node.js eslint extension plugins &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-33-start-a-codeblocks-curly-braces-on-the-same-line&quot;&gt;3.3 Start a Codeblock&#39;s Curly Braces on the Same Line&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-34-separate-your-statements-properly&quot;&gt;3.4 Separate your statements properly&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-35-name-your-functions&quot;&gt;3.5 Name your functions&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-36-use-naming-conventions-for-variables-constants-functions-and-classes&quot;&gt;3.6 Use naming conventions for variables, constants, functions and classes&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-37-prefer-const-over-let-ditch-the-var&quot;&gt;3.7 Prefer const over let. Ditch the var&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-38-require-modules-first-not-inside-functions&quot;&gt;3.8 Require modules first, not inside functions&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-39-set-an-explicit-entry-point-to-a-modulefolder&quot;&gt;3.9 Set an explicit entry point to a module/folder &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-310-use-the--operator&quot;&gt;3.10 Use the === operator&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-311-use-async-await-avoid-callbacks&quot;&gt;3.11 Use Async Await, avoid callbacks &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-312-use-arrow-function-expressions-&quot;&gt;3.12 Use arrow function expressions (=&amp;gt;)&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-313-avoid-effects-outside-of-functions&quot;&gt;3.13 Avoid effects outside of functions &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#4-testing-and-overall-quality-practices&quot;&gt;4. Testing And Overall Quality Practices (13)&lt;/a&gt; &lt;/summary&gt; 
 &lt;p&gt;  &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-41-at-the-very-least-write-api-component-testing&quot;&gt;4.1 At the very least, write API (component) testing &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-42-include-3-parts-in-each-test-name&quot;&gt;4.2 Include 3 parts in each test name &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-43-structure-tests-by-the-aaa-pattern&quot;&gt;4.3 Structure tests by the AAA pattern &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-44-ensure-node-version-is-unified&quot;&gt;4.4 Ensure Node version is unified &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-45-avoid-global-test-fixtures-and-seeds-add-data-per-test&quot;&gt;4.5 Avoid global test fixtures and seeds, add data per-test &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-46-tag-your-tests&quot;&gt;4.6 Tag your tests &lt;code&gt;#advanced&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-47-check-your-test-coverage-it-helps-to-identify-wrong-test-patterns&quot;&gt;4.7 Check your test coverage, it helps to identify wrong test patterns&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-48-use-production-like-environment-for-e2e-testing&quot;&gt;4.8 Use production-like environment for e2e testing&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-49-refactor-regularly-using-static-analysis-tools&quot;&gt;4.9 Refactor regularly using static analysis tools&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-410-mock-responses-of-external-http-services&quot;&gt;4.10 Mock responses of external HTTP services #advanced &lt;code&gt;#new&lt;/code&gt; &lt;code&gt;#advanced&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-411-test-your-middlewares-in-isolation&quot;&gt;4.11 Test your middlewares in isolation&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-412-specify-a-port-in-production-randomize-in-testing&quot;&gt;4.12 Specify a port in production, randomize in testing &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-413-test-the-five-possible-outcomes&quot;&gt;4.13 Test the five possible outcomes #strategic &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#5-going-to-production-practices&quot;&gt;5. Going To Production Practices (19)&lt;/a&gt; &lt;/summary&gt; 
 &lt;p&gt;  &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-51-monitoring&quot;&gt;5.1. Monitoring &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-52-increase-the-observability-using-smart-logging&quot;&gt;5.2. Increase the observability using smart logging &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-53-delegate-anything-possible-eg-gzip-ssl-to-a-reverse-proxy&quot;&gt;5.3. Delegate anything possible (e.g. gzip, SSL) to a reverse proxy &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-54-lock-dependencies&quot;&gt;5.4. Lock dependencies&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-55-guard-process-uptime-using-the-right-tool&quot;&gt;5.5. Guard process uptime using the right tool&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-56-utilize-all-cpu-cores&quot;&gt;5.6. Utilize all CPU cores&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-57-create-a-maintenance-endpoint&quot;&gt;5.7. Create a ‘maintenance endpoint’&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-58-discover-the-unknowns-using-apm-products&quot;&gt;5.8. Discover the unknowns using APM products &lt;code&gt;#advanced&lt;/code&gt; &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-59-make-your-code-production-ready&quot;&gt;5.9. Make your code production-ready&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-510-measure-and-guard-the-memory-usage&quot;&gt;5.10. Measure and guard the memory usage &lt;code&gt;#advanced&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-511-get-your-frontend-assets-out-of-node&quot;&gt;5.11. Get your frontend assets out of Node&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-512-strive-to-be-stateless&quot;&gt;5.12. Strive to be stateless &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-513-use-tools-that-automatically-detect-vulnerabilities&quot;&gt;5.13. Use tools that automatically detect vulnerabilities&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-514-assign-a-transaction-id-to-each-log-statement&quot;&gt;5.14. Assign a transaction id to each log statement &lt;code&gt;#advanced&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-515-set-node_envproduction&quot;&gt;5.15. Set NODE_ENV=production&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-516-design-automated-atomic-and-zero-downtime-deployments&quot;&gt;5.16. Design automated, atomic and zero-downtime deployments &lt;code&gt;#advanced&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-517-use-an-lts-release-of-nodejs&quot;&gt;5.17. Use an LTS release of Node.js&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-518-log-to-stdout-avoid-specifying-log-destination-within-the-app&quot;&gt;5.18. Log to stdout, avoid specifying log destination within the app &lt;code&gt;#updated&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-519-install-your-packages-with-npm-ci&quot;&gt;5.19. Install your packages with npm ci &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#6-security-best-practices&quot;&gt;6. Security Practices (25)&lt;/a&gt; &lt;/summary&gt; 
 &lt;p&gt;  &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-61-embrace-linter-security-rules&quot;&gt;6.1. Embrace linter security rules&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-62-limit-concurrent-requests-using-a-middleware&quot;&gt;6.2. Limit concurrent requests using a middleware&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-63-extract-secrets-from-config-files-or-use-packages-to-encrypt-them&quot;&gt;6.3 Extract secrets from config files or use packages to encrypt them &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-64-prevent-query-injection-vulnerabilities-with-ormodm-libraries&quot;&gt;6.4. Prevent query injection vulnerabilities with ORM/ODM libraries &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-65-collection-of-generic-security-best-practices&quot;&gt;6.5. Collection of generic security best practices&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-66-adjust-the-http-response-headers-for-enhanced-security&quot;&gt;6.6. Adjust the HTTP response headers for enhanced security&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-67-constantly-and-automatically-inspect-for-vulnerable-dependencies&quot;&gt;6.7. Constantly and automatically inspect for vulnerable dependencies &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-68-protect-users-passwordssecrets-using-bcrypt-or-scrypt&quot;&gt;6.8. Protect Users&#39; Passwords/Secrets using bcrypt or scrypt &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-69-escape-html-js-and-css-output&quot;&gt;6.9. Escape HTML, JS and CSS output&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-610-validate-incoming-json-schemas&quot;&gt;6.10. Validate incoming JSON schemas &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-611-support-blocklisting-jwts&quot;&gt;6.11. Support blocklisting JWTs&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-612-prevent-brute-force-attacks-against-authorization&quot;&gt;6.12. Prevent brute-force attacks against authorization &lt;code&gt;#advanced&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-613-run-nodejs-as-non-root-user&quot;&gt;6.13. Run Node.js as non-root user&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-614-limit-payload-size-using-a-reverse-proxy-or-a-middleware&quot;&gt;6.14. Limit payload size using a reverse-proxy or a middleware&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-615-avoid-javascript-eval-statements&quot;&gt;6.15. Avoid JavaScript eval statements&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-616-prevent-evil-regex-from-overloading-your-single-thread-execution&quot;&gt;6.16. Prevent evil RegEx from overloading your single thread execution&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-617-avoid-module-loading-using-a-variable&quot;&gt;6.17. Avoid module loading using a variable&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-618-run-unsafe-code-in-a-sandbox&quot;&gt;6.18. Run unsafe code in a sandbox&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-619-take-extra-care-when-working-with-child-processes&quot;&gt;6.19. Take extra care when working with child processes &lt;code&gt;#advanced&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-620-hide-error-details-from-clients&quot;&gt;6.20. Hide error details from clients&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-621-configure-2fa-for-npm-or-yarn&quot;&gt;6.21. Configure 2FA for npm or Yarn &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-622-modify-session-middleware-settings&quot;&gt;6.22. Modify session middleware settings&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-623-avoid-dos-attacks-by-explicitly-setting-when-a-process-should-crash&quot;&gt;6.23. Avoid DOS attacks by explicitly setting when a process should crash &lt;code&gt;#advanced&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-624-prevent-unsafe-redirects&quot;&gt;6.24. Prevent unsafe redirects&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-625-avoid-publishing-secrets-to-the-npm-registry&quot;&gt;6.25. Avoid publishing secrets to the npm registry&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-626-inspect-for-outdated-packages&quot;&gt;6.26. 6.26 Inspect for outdated packages&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-627-import-built-in-modules-using-the-node-protocol&quot;&gt;6.27. Import built-in modules using the &#39;node:&#39; protocol &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#7-draft-performance-best-practices&quot;&gt;7. Performance Practices (2) (Work In Progress️ ✍️)&lt;/a&gt; &lt;/summary&gt; 
 &lt;p&gt;  &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-71-dont-block-the-event-loop&quot;&gt;7.1. Don&#39;t block the event loop&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-72-prefer-native-js-methods-over-user-land-utils-like-lodash&quot;&gt;7.2. Prefer native JS methods over user-land utils like Lodash&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#8-docker-best-practices&quot;&gt;8. Docker Practices (15)&lt;/a&gt; &lt;/summary&gt; 
 &lt;p&gt;  &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-81-use-multi-stage-builds-for-leaner-and-more-secure-docker-images&quot;&gt;8.1 Use multi-stage builds for leaner and more secure Docker images &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-82-bootstrap-using-node-command-avoid-npm-start&quot;&gt;8.2. Bootstrap using node command, avoid npm start&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-83-let-the-docker-runtime-handle-replication-and-uptime&quot;&gt;8.3. Let the Docker runtime handle replication and uptime &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-84-use-dockerignore-to-prevent-leaking-secrets&quot;&gt;8.4. Use .dockerignore to prevent leaking secrets&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-85-clean-up-dependencies-before-production&quot;&gt;8.5. Clean-up dependencies before production&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-86-shutdown-smartly-and-gracefully&quot;&gt;8.6. Shutdown smartly and gracefully &lt;code&gt;#advanced&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-87-set-memory-limits-using-both-docker-and-v8&quot;&gt;8.7. Set memory limits using both Docker and v8 &lt;code&gt;#advanced&lt;/code&gt; &lt;code&gt;#strategic&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-88-plan-for-efficient-caching&quot;&gt;8.8. Plan for efficient caching&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-89-use-explicit-image-reference-avoid-latest-tag&quot;&gt;8.9. Use explicit image reference, avoid latest tag&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-810-prefer-smaller-docker-base-images&quot;&gt;8.10. Prefer smaller Docker base images&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-811-clean-out-build-time-secrets-avoid-secrets-in-args&quot;&gt;8.11. Clean-out build-time secrets, avoid secrets in args &lt;code&gt;#strategic #new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-812-scan-images-for-multi-layers-of-vulnerabilities&quot;&gt;8.12. Scan images for multi layers of vulnerabilities &lt;code&gt;#advanced&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-813-clean-node_module-cache&quot;&gt;8.13 Clean NODE_MODULE cache&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-814-generic-docker-practices&quot;&gt;8.14. Generic Docker practices&lt;/a&gt;&lt;br /&gt;   &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#-815-lint-your-dockerfile&quot;&gt;8.15. Lint your Dockerfile &lt;code&gt;#new&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;code&gt;1. Project Architecture Practices&lt;/code&gt;&lt;/h1&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 1.1 Structure your solution by business components&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The root of a system should contain folders or repositories that represent reasonably sized business modules. Each component represents a product domain (i.e., bounded context), like &#39;user-component&#39;, &#39;order-component&#39;, etc. Each component has its own API, logic, and logical database. What is the significant merit? With an autonomous component, every change is performed over a granular and smaller scope - the mental overload, development friction, and deployment fear are much smaller and better. As a result, developers can move much faster. This does not necessarily demand physical separation and can be achieved using a Monorepo or with a multi-repo&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;my-system
├─ apps (components)
│  ├─ orders
│  ├─ users
│  ├─ payments
├─ libraries (generic cross-component functionality)
│  ├─ logger
│  ├─ authenticator
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; when artifacts from various modules/topics are mixed together, there are great chances of a tightly-coupled &#39;spaghetti&#39; system. For example, in an architecture where &#39;module-a controller&#39; might call &#39;module-b service&#39;, there are no clear modularity borders - every code change might affect anything else. With this approach, developers who code new features struggle to realize the scope and impact of their change. Consequently, they fear breaking other modules, and each deployment becomes slower and riskier&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/projectstructre/breakintcomponents.md&quot;&gt;&lt;strong&gt;Read More: structure by components&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 1.2 Layer your components with 3-tiers, keep the web layer within its boundaries&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Each component should contain &#39;layers&#39; - a dedicated folder for common concerns: &#39;entry-point&#39; where controller lives, &#39;domain&#39; where the logic lives, and &#39;data-access&#39;. The primary principle of the most popular architectures is to separate the technical concerns (e.g., HTTP, DB, etc) from the pure logic of the app so a developer can code more features without worrying about infrastructural concerns. Putting each concern in a dedicated folder, also known as the &lt;a href=&quot;https://en.wikipedia.org/wiki/Multitier_architecture&quot;&gt;3-Tier pattern&lt;/a&gt;, is the &lt;em&gt;simplest&lt;/em&gt; way to meet this goal&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;my-system
├─ apps (components)
│  ├─ component-a
   │  ├─ entry-points
   │  │  ├─ api # controller comes here
   │  │  ├─ message-queue # message consumer comes here
   │  ├─ domain # features and flows: DTO, services, logic
   │  ├─ data-access # DB calls w/o ORM
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; It&#39;s often seen that developer pass web objects like request/response to functions in the domain/logic layer - this violates the separation principle and makes it harder to access later the logic code by other clients like testing code, scheduled jobs, message queues, etc&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/projectstructre/createlayers.md&quot;&gt;&lt;strong&gt;Read More: layer your app&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 1.3 Wrap common utilities as packages, consider publishing&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Place all reusable modules in a dedicated folder, e.g., &quot;libraries&quot;, and underneath each module in its own folder, e.g., &quot;/libraries/logger&quot;. Make the module an independent package with its own package.json file to increase the module encapsulation, and allows future publishing to a repository. In a Monorepo setup, modules can be consumed by &#39;npm linking&#39; to their physical paths, using ts-paths or by publishing and installing from a package manager repository like the npm registry&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;my-system
├─ apps (components)
  │  ├─ component-a
├─ libraries (generic cross-component functionality)
│  ├─ logger
│  │  ├─ package.json
│  │  ├─ src
│  │  │ ├─ index.js

&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Clients of a module might import and get coupled to internal functionality of a module. With a package.json at the root, one can set a package.json.main or package.json.exports to explicitly tell which files and functions are part of the public interface&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/projectstructre/wraputilities.md&quot;&gt;&lt;strong&gt;Read More: Structure by feature&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 1.4 Use environment aware, secure and hierarchical config&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; A flawless configuration setup should ensure (a) keys can be read from file AND from environment variable (b) secrets are kept outside committed code (c) config is hierarchical for easier findability (d) typing support (e) validation for failing fast (f) Specify default for each key. There are a few packages that can help tick most of those boxes like &lt;a href=&quot;https://www.npmjs.com/package/convict&quot;&gt;convict&lt;/a&gt;, &lt;a href=&quot;https://github.com/evanshortiss/env-var&quot;&gt;env-var&lt;/a&gt;, &lt;a href=&quot;https://github.com/colinhacks/zod&quot;&gt;zod&lt;/a&gt;, and others&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Consider a mandatory environment variable that wasn&#39;t provided. The app starts successfully and serve requests, some information is already persisted to DB. Then, it&#39;s realized that without this mandatory key the request can&#39;t complete, leaving the app in a dirty state&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/projectstructre/configguide.md&quot;&gt;&lt;strong&gt;Read More: configuration best practices&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 1.5 Consider all the consequences when choosing the main framework&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; When building apps and APIs, using a framework is mandatory. It&#39;s easy to overlook alternative frameworks or important considerations and then finally land on a sub optimal option. As of 2023/2024, we believe that these four frameworks are worth considering: &lt;a href=&quot;https://nestjs.com/&quot;&gt;Nest.js&lt;/a&gt;, &lt;a href=&quot;https://www.fastify.io/&quot;&gt;Fastify&lt;/a&gt;, &lt;a href=&quot;https://expressjs.com/&quot;&gt;express&lt;/a&gt;, and &lt;a href=&quot;https://koajs.com/&quot;&gt;Koa&lt;/a&gt;. Click read more below for a detailed pros/cons of each framework. Simplistically, we believe that Nest.js is the best match for teams who wish to go OOP and/or build large-scale apps that can&#39;t get partitioned into smaller &lt;em&gt;autonomous&lt;/em&gt; components. Fastify is our recommendation for apps with reasonably-sized components (e.g., Microservices) that are built around simple Node.js mechanics. Read our &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/projectstructre/choose-framework.md&quot;&gt;full considerations guide here&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Due to the overwhelming amount of considerations, it&#39;s easy to make decisions based on partial information and compare apples with oranges. For example, it&#39;s believed that Fastify is a minimal web-server that should get compared with express only. In reality, it&#39;s a rich framework with many official plugins that cover many concerns&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/projectstructre/choose-framework.md&quot;&gt;&lt;strong&gt;Read More: Choosing the right framework&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 1.6 Use TypeScript sparingly and thoughtfully&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Coding without type safety is no longer an option, TypeScript is the most popular option for this mission. Use it to define variables and functions return types. With that, it is also a double edge sword that can greatly &lt;em&gt;encourage&lt;/em&gt; complexity with its additional ~ 50 keywords and sophisticated features. Consider using it sparingly, mostly with simple types, and utilize advanced features only when a real need arises&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; &lt;a href=&quot;https://earlbarr.com/publications/typestudy.pdf&quot;&gt;Researches&lt;/a&gt; show that using TypeScript can help in detecting ~20% bugs earlier. Without it, also the developer experience in the IDE is intolerable. On the flip side, 80% of other bugs were not discovered using types. Consequently, typed syntax is valuable but limited. Only efficient tests can discover the whole spectrum of bugs, including type-related bugs. It might also defeat its purpose: sophisticated code features are likely to increase the code complexity, which by itself increases both the amount of bugs and the average bug fix time&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/projectstructre/typescript-considerations.md&quot;&gt;&lt;strong&gt;Read More: TypeScript considerations&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#table-of-contents&quot;&gt;⬆ Return to top&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;code&gt;2. Error Handling Practices&lt;/code&gt;&lt;/h1&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.1 Use Async-Await or promises for async error handling&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Handling async errors in callback style is probably the fastest way to hell (a.k.a the pyramid of doom). The best gift you can give to your code is using Promises with async-await which enables a much more compact and familiar code syntax like try-catch&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Node.js callback style, function(err, response), is a promising way to un-maintainable code due to the mix of error handling with casual code, excessive nesting, and awkward coding patterns&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/asyncerrorhandling.md&quot;&gt;&lt;strong&gt;Read More: avoiding callbacks&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.2 Extend the built-in Error object&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Some libraries throw errors as a string or as some custom type – this complicates the error handling logic and the interoperability between modules. Instead, create app error object/class that extends the built-in Error object and use it whenever rejecting, throwing or emitting an error. The app error should add useful imperative properties like the error name/code and isCatastrophic. By doing so, all errors have a unified structure and support better error handling. There is &lt;code&gt;no-throw-literal&lt;/code&gt; ESLint rule that strictly checks that (although it has some &lt;a href=&quot;https://eslint.org/docs/rules/no-throw-literal&quot;&gt;limitations&lt;/a&gt; which can be solved when using TypeScript and setting the &lt;code&gt;@typescript-eslint/no-throw-literal&lt;/code&gt; rule)&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; When invoking some component, being uncertain which type of errors come in return – it makes proper error handling much harder. Even worse, using custom types to describe errors might lead to loss of critical error information like the stack trace!&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/useonlythebuiltinerror.md&quot;&gt;&lt;strong&gt;Read More: using the built-in error object&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.3 Distinguish catastrophic errors from operational errors&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Operational errors (e.g. API received an invalid input) refer to known cases where the error impact is fully understood and can be handled thoughtfully. On the other hand, catastrophic error (also known as programmer errors) refers to unusual code failures that dictate to gracefully restart the application&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; You may always restart the application when an error appears, but why let ~5000 online users down because of a minor, predicted, operational error? The opposite is also not ideal – keeping the application up when an unknown catastrophic issue (programmer error) occurred might lead to an unpredicted behavior. Differentiating the two allows acting tactfully and applying a balanced approach based on the given context&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/operationalvsprogrammererror.md&quot;&gt;&lt;strong&gt;Read More: operational vs programmer error&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.4 Handle errors centrally, not within a middleware&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Error handling logic such as logging, deciding whether to crash and monitoring metrics should be encapsulated in a dedicated and centralized object that all entry-points (e.g. APIs, cron jobs, scheduled jobs) call when an error comes in&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Not handling errors within a single place will lead to code duplication and probably to improperly handled errors&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/centralizedhandling.md&quot;&gt;&lt;strong&gt;Read More: handling errors in a centralized place&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.5 Document API errors using OpenAPI or GraphQL&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Let your API callers know which errors might come in return so they can handle these thoughtfully without crashing. For RESTful APIs, this is usually done with documentation frameworks like OpenAPI. If you&#39;re using GraphQL, you can utilize your schema and comments as well&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; An API client might decide to crash and restart only because it received back an error it couldn’t understand. Note: the caller of your API might be you (very typical in a microservice environment)&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/documentingusingswagger.md&quot;&gt;&lt;strong&gt;Read More: documenting API errors in Swagger or GraphQL&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.6 Exit the process gracefully when a stranger comes to town&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; When an unknown error occurs (catastrophic error, see best practice 2.3) - there is uncertainty about the application healthiness. In this case, there is no escape from making the error observable, shutting off connections and exiting the process. Any reputable runtime framework like Dockerized services or cloud serverless solutions will take care to restart&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; When an unfamiliar exception occurs, some object might be in a faulty state (e.g. an event emitter which is used globally and not firing events anymore due to some internal failure) and all future requests might fail or behave crazily&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/shuttingtheprocess.md&quot;&gt;&lt;strong&gt;Read More: shutting the process&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.7 Use a mature logger to increase errors visibility&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; A robust logging tools like &lt;a href=&quot;https://github.com/pinojs/pino&quot;&gt;Pino&lt;/a&gt; or &lt;a href=&quot;https://github.com/winstonjs/winston&quot;&gt;Winston&lt;/a&gt; increases the errors visibility using features like log-levels, pretty print coloring and more. Console.log lacks these imperative features and should be avoided. The best in class logger allows attaching custom useful properties to log entries with minimized serialization performance penalty. Developers should write logs to &lt;code&gt;stdout&lt;/code&gt; and let the infrastructure pipe the stream to the appropriate log aggregator&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Skimming through console.logs or manually through messy text file without querying tools or a decent log viewer might keep you busy at work until late&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/usematurelogger.md&quot;&gt;&lt;strong&gt;Read More: using a mature logger&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.8 Test error flows using your favorite test framework&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Whether professional automated QA or plain manual developer testing – Ensure that your code not only satisfies positive scenarios but also handles and returns the right errors. On top of this, simulate deeper error flows like uncaught exceptions and ensure that the error handler treat these properly (see code examples within the &quot;read more&quot; section)&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Without testing, whether automatically or manually, you can’t rely on your code to return the right errors. Without meaningful errors – there’s no error handling&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/testingerrorflows.md&quot;&gt;&lt;strong&gt;Read More: testing error flows&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.9 Discover errors and downtime using APM products&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Monitoring and performance products (a.k.a APM) proactively gauge your codebase or API so they can automagically highlight errors, crashes, and slow parts that you were missing&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; You might spend great effort on measuring API performance and downtimes, probably you’ll never be aware which are your slowest code parts under real-world scenario and how these affect the UX&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/apmproducts.md&quot;&gt;&lt;strong&gt;Read More: using APM products&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.10 Catch unhandled promise rejections&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Any exception thrown within a promise will get swallowed and discarded unless a developer didn’t forget to explicitly handle it. Even if your code is subscribed to &lt;code&gt;process.uncaughtException&lt;/code&gt;! Overcome this by registering to the event &lt;code&gt;process.unhandledRejection&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Your errors will get swallowed and leave no trace. Nothing to worry about&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/catchunhandledpromiserejection.md&quot;&gt;&lt;strong&gt;Read More: catching unhandled promise rejection&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.11 Fail fast, validate arguments using a dedicated library&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Assert API input to avoid nasty bugs that are much harder to track later. The validation code is usually tedious unless you are using a modern validation library like &lt;a href=&quot;https://www.npmjs.com/package/ajv&quot;&gt;ajv&lt;/a&gt;, &lt;a href=&quot;https://github.com/colinhacks/zod&quot;&gt;zod&lt;/a&gt;, or &lt;a href=&quot;https://github.com/sinclairzx81/typebox&quot;&gt;typebox&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Consider this – your function expects a numeric argument “Discount” which the caller forgets to pass, later on, your code checks if Discount!=0 (amount of allowed discount is greater than zero), then it will allow the user to enjoy a discount. OMG, what a nasty bug. Can you see it?&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/failfast.md&quot;&gt;&lt;strong&gt;Read More: failing fast&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.12 Always await promises before returning to avoid a partial stacktrace&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Always do &lt;code&gt;return await&lt;/code&gt; when returning a promise to benefit full error stacktrace. If a function returns a promise, that function must be declared as &lt;code&gt;async&lt;/code&gt; function and explicitly &lt;code&gt;await&lt;/code&gt; the promise before returning it&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; The function that returns a promise without awaiting won&#39;t appear in the stacktrace. Such missing frames would probably complicate the understanding of the flow that leads to the error, especially if the cause of the abnormal behavior is inside of the missing function&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/errorhandling/returningpromises.md&quot;&gt;&lt;strong&gt;Read More: returning promises&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 2.13 Subscribe to event emitters and streams &#39;error&#39; event&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Unlike typical functions, a try-catch clause won&#39;t get errors that originate from Event Emitters and anything inherited from it (e.g., streams). Instead of try-catch, subscribe to an event emitter&#39;s &#39;error&#39; event so your code can handle the error in context. When dealing with &lt;a href=&quot;https://nodejs.org/api/events.html#eventtarget-and-event-api&quot;&gt;EventTargets&lt;/a&gt; (the web standard version of Event Emitters) there are no &#39;error&#39; event and all errors end in the process.on(&#39;error) global event - in this case, at least ensure that the process crash or not based on the desired context. Also, mind that error originating from &lt;em&gt;asynchronous&lt;/em&gt; event handlers are not get caught unless the event emitter is initialized with {captureRejections: true}&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Event emitters are commonly used for global and key application functionality such as DB or message queue connection. When this kind of crucial objects throw an error, at best the process will crash due to unhandled exception. Even worst, it will stay alive as a zombie while a key functionality is turned off&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#table-of-contents&quot;&gt;⬆ Return to top&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;code&gt;3. Code Patterns And Style Practices&lt;/code&gt;&lt;/h1&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.1 Use ESLint&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;a href=&quot;https://eslint.org&quot;&gt;ESLint&lt;/a&gt; is the de-facto standard for checking possible code errors and fixing code style, not only to identify nitty-gritty spacing issues but also to detect serious code anti-patterns like developers throwing errors without classification. Though ESLint can automatically fix code styles, other tools like &lt;a href=&quot;https://www.npmjs.com/package/prettier&quot;&gt;prettier&lt;/a&gt; are more powerful in formatting the fix and work in conjunction with ESLint&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Developers will focus on tedious spacing and line-width concerns and time might be wasted overthinking the project&#39;s code style&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/codestylepractices/eslint_prettier.md&quot;&gt;&lt;strong&gt;Read More: Using ESLint and Prettier&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.2 Use Node.js eslint extension plugins&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; On top of ESLint standard rules that cover vanilla JavaScript, add Node.js specific plugins like &lt;a href=&quot;https://www.npmjs.com/package/eslint-plugin-node&quot;&gt;eslint-plugin-node&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/eslint-plugin-mocha&quot;&gt;eslint-plugin-mocha&lt;/a&gt; and &lt;a href=&quot;https://www.npmjs.com/package/eslint-plugin-security&quot;&gt;eslint-plugin-node-security&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/eslint-plugin-require&quot;&gt;eslint-plugin-require&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/eslint-plugin-jest&quot;&gt;/eslint-plugin-jest&lt;/a&gt; and other useful rules&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Many faulty Node.js code patterns might escape under the radar. For example, developers might require(variableAsPath) files with a variable given as a path which allows attackers to execute any JS script. Node.js linters can detect such patterns and complain early&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.3 Start a Codeblock&#39;s Curly Braces on the Same Line&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The opening curly braces of a code block should be on the same line as the opening statement&lt;/p&gt; 
&lt;h3&gt;Code Example&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// Do
function someFunction() {
  // code block
}

// Avoid
function someFunction()
{
  // code block
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Deferring from this best practice might lead to unexpected results, as seen in the StackOverflow thread below:&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://stackoverflow.com/questions/3641519/why-does-a-results-vary-based-on-curly-brace-placement&quot;&gt;&lt;strong&gt;Read more:&lt;/strong&gt; &quot;Why do results vary based on curly brace placement?&quot; (StackOverflow)&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.4 Separate your statements properly&lt;/h2&gt; 
&lt;p&gt;No matter if you use semicolons or not to separate your statements, knowing the common pitfalls of improper linebreaks or automatic semicolon insertion, will help you to eliminate regular syntax errors.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Use ESLint to gain awareness about separation concerns. &lt;a href=&quot;https://prettier.io/&quot;&gt;Prettier&lt;/a&gt; or &lt;a href=&quot;https://standardjs.com/&quot;&gt;Standardjs&lt;/a&gt; can automatically resolve these issues.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; As seen in the previous section, JavaScript&#39;s interpreter automatically adds a semicolon at the end of a statement if there isn&#39;t one, or considers a statement as not ended where it should, which might lead to some undesired results. You can use assignments and avoid using immediately invoked function expressions to prevent most of the unexpected errors.&lt;/p&gt; 
&lt;h3&gt;Code example&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// Do
function doThing() {
    // ...
}

doThing()

// Do

const items = [1, 2, 3]
items.forEach(console.log)

// Avoid — throws exception
const m = new Map()
const a = [1,2,3]
[...m.values()].forEach(console.log)
&amp;gt; [...m.values()].forEach(console.log)
&amp;gt;  ^^^
&amp;gt; SyntaxError: Unexpected token ...

// Avoid — throws exception
const count = 2 // it tries to run 2(), but 2 is not a function
(function doSomething() {
  // do something amazing
}())
// put a semicolon before the immediate invoked function, after the const definition, save the return value of the anonymous function to a variable or avoid IIFEs altogether
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://eslint.org/docs/rules/semi&quot;&gt;&lt;strong&gt;Read more:&lt;/strong&gt; &quot;Semi ESLint rule&quot;&lt;/a&gt; 🔗 &lt;a href=&quot;https://eslint.org/docs/rules/no-unexpected-multiline&quot;&gt;&lt;strong&gt;Read more:&lt;/strong&gt; &quot;No unexpected multiline ESLint rule&quot;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.5 Name your functions&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Name all functions, including closures and callbacks. Avoid anonymous functions. This is especially useful when profiling a node app. Naming all functions will allow you to easily understand what you&#39;re looking at when checking a memory snapshot&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Debugging production issues using a core dump (memory snapshot) might become challenging as you notice significant memory consumption from anonymous functions&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.6 Use naming conventions for variables, constants, functions and classes&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Use &lt;strong&gt;&lt;em&gt;lowerCamelCase&lt;/em&gt;&lt;/strong&gt; when naming constants, variables and functions, &lt;strong&gt;&lt;em&gt;UpperCamelCase&lt;/em&gt;&lt;/strong&gt; (capital first letter as well) when naming classes and &lt;strong&gt;&lt;em&gt;UPPER_SNAKE_CASE&lt;/em&gt;&lt;/strong&gt; when naming global or static variables. This will help you to easily distinguish between plain variables, functions, classes that require instantiation and variables declared at global module scope. Use descriptive names, but try to keep them short&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; JavaScript is the only language in the world that allows invoking a constructor (&quot;Class&quot;) directly without instantiating it first. Consequently, Classes and function-constructors are differentiated by starting with UpperCamelCase&lt;/p&gt; 
&lt;h3&gt;3.6 Code Example&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// for global variables names we use the const/let keyword and UPPER_SNAKE_CASE
let MUTABLE_GLOBAL = &quot;mutable value&quot;;
const GLOBAL_CONSTANT = &quot;immutable value&quot;;
const CONFIG = {
  key: &quot;value&quot;,
};

// examples of UPPER_SNAKE_CASE convention in nodejs/javascript ecosystem
// in javascript Math.PI module
const PI = 3.141592653589793;

// https://github.com/nodejs/node/blob/b9f36062d7b5c5039498e98d2f2c180dca2a7065/lib/internal/http2/core.js#L303
// in nodejs http2 module
const HTTP_STATUS_OK = 200;
const HTTP_STATUS_CREATED = 201;

// for class name we use UpperCamelCase
class SomeClassExample {
  // for static class properties we use UPPER_SNAKE_CASE
  static STATIC_PROPERTY = &quot;value&quot;;
}

// for functions names we use lowerCamelCase
function doSomething() {
  // for scoped variable names we use the const/let keyword and lowerCamelCase
  const someConstExample = &quot;immutable value&quot;;
  let someMutableExample = &quot;mutable value&quot;;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.7 Prefer const over let. Ditch the var&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Using &lt;code&gt;const&lt;/code&gt; means that once a variable is assigned, it cannot be reassigned. Preferring &lt;code&gt;const&lt;/code&gt; will help you to not be tempted to use the same variable for different uses, and make your code clearer. If a variable needs to be reassigned, in a for loop, for example, use &lt;code&gt;let&lt;/code&gt; to declare it. Another important aspect of &lt;code&gt;let&lt;/code&gt; is that a variable declared using it is only available in the block scope in which it was defined. &lt;code&gt;var&lt;/code&gt; is function scoped, not block-scoped, and &lt;a href=&quot;https://hackernoon.com/why-you-shouldnt-use-var-anymore-f109a58b9b70&quot;&gt;shouldn&#39;t be used in ES6&lt;/a&gt; now that you have &lt;code&gt;const&lt;/code&gt; and &lt;code&gt;let&lt;/code&gt; at your disposal&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Debugging becomes way more cumbersome when following a variable that frequently changes&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75&quot;&gt;&lt;strong&gt;Read more: JavaScript ES6+: var, let, or const?&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.8 Require modules first, not inside functions&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Require modules at the beginning of each file, before and outside of any functions. This simple best practice will not only help you easily and quickly tell the dependencies of a file right at the top but also avoids a couple of potential problems&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Requires are run synchronously by Node.js. If they are called from within a function, it may block other requests from being handled at a more critical time. Also, if a required module or any of its dependencies throw an error and crash the server, it is best to find out about it as soon as possible, which might not be the case if that module is required from within a function&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.9 Set an explicit entry point to a module/folder&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; When developing a module/library, set an explicit root file that exports the public and interesting code. Discourage the client code from importing deep files and becoming familiar with the internal structure. With commonjs (require), this can be done with an index.js file at the folder&#39;s root or the package.json.main field. With ESM (import), if a package.json exists on the root, the field &quot;exports&quot; allow specifying the module&#39;s root file. If no package.json exists, you may put an index.js file on the root which re-exports all the public functionality&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Having an explicit root file acts like a public &#39;interface&#39; that encapsulates the internal, directs the caller to the public code and facilitates future changes without breaking the contract&lt;/p&gt; 
&lt;h3&gt;3.9 Code example - avoid coupling the client to the module structure&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// Avoid: client has deep familiarity with the internals

// Client code
const SMSWithMedia = require(&quot;./SMSProvider/providers/media/media-provider.js&quot;);

// Better: explicitly export the public functions

//index.js, module code
module.exports.SMSWithMedia = require(&quot;./SMSProvider/providers/media/media-provider.js&quot;);

// Client code
const { SMSWithMedia } = require(&quot;./SMSProvider&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.10 Use the &lt;code&gt;===&lt;/code&gt; operator&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Prefer the strict equality operator &lt;code&gt;===&lt;/code&gt; over the weaker abstract equality operator &lt;code&gt;==&lt;/code&gt;. &lt;code&gt;==&lt;/code&gt; will compare two variables after converting them to a common type. There is no type conversion in &lt;code&gt;===&lt;/code&gt;, and both variables must be of the same type to be equal&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Unequal variables might return true when compared with the &lt;code&gt;==&lt;/code&gt; operator&lt;/p&gt; 
&lt;h3&gt;3.10 Code example&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&quot;&quot; == &quot;0&quot;; // false
0 == &quot;&quot;; // true
0 == &quot;0&quot;; // true

false == &quot;false&quot;; // false
false == &quot;0&quot;; // true

false == undefined; // false
false == null; // false
null == undefined; // true

&quot; \t\r\n &quot; == 0; // true
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;All statements above will return false if used with &lt;code&gt;===&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.11 Use Async Await, avoid callbacks&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Async-await is the simplest way to express an asynchronous flow as it makes asynchronous code look synchronous. Async-await will also result in much more compact code and support for try-catch. This technique now supersedes callbacks and promises in &lt;em&gt;most&lt;/em&gt; cases. Using it in your code is probably the best gift one can give to the code reader&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Handling async errors in callback style are probably the fastest way to hell - this style forces to check errors all over, deal with awkward code nesting, and makes it difficult to reason about the code flow&lt;/p&gt; 
&lt;p&gt;🔗&lt;a href=&quot;https://github.com/yortus/asyncawait&quot;&gt;&lt;strong&gt;Read more:&lt;/strong&gt; Guide to async-await 1.0&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.12 Use arrow function expressions (=&amp;gt;)&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Though it&#39;s recommended to use async-await and avoid function parameters when dealing with older APIs that accept promises or callbacks - arrow functions make the code structure more compact and keep the lexical context of the root function (i.e. &lt;code&gt;this&lt;/code&gt;)&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Longer code (in ES5 functions) is more prone to bugs and cumbersome to read&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://medium.com/javascript-scene/familiarity-bias-is-holding-you-back-its-time-to-embrace-arrow-functions-3d37e1a9bb75&quot;&gt;&lt;strong&gt;Read more: It’s Time to Embrace Arrow Functions&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 3.13 Avoid effects outside of functions&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Avoid putting code with effects like network or DB calls outside of functions. Such a code will be executed immediately when another file requires the file. This &#39;floating&#39; code might get executed when the underlying system is not ready yet. It also comes with a performance penalty even when this module&#39;s functions will finally not be used in runtime. Last, mocking these DB/network calls for testing is harder outside of functions. Instead, put this code inside functions that should get called explicitly. If some DB/network code must get executed right when the module loads, consider using the factory or revealing module patterns&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; A typical web framework sets error handler, environment variables and monitoring. When DB/network calls are made before the web framework is initialized, they won&#39;t be monitored or fail due to a lack of configuration data&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#table-of-contents&quot;&gt;⬆ Return to top&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;code&gt;4. Testing And Overall Quality Practices&lt;/code&gt;&lt;/h1&gt; 
&lt;p&gt;_We have dedicated guides for testing, see below. The best practices list here is a brief summary of these guides&lt;/p&gt; 
&lt;p&gt;a. &lt;a href=&quot;https://github.com/goldbergyoni/javascript-testing-best-practices&quot;&gt;JavaScript testing best practices&lt;/a&gt; b. &lt;a href=&quot;https://github.com/testjavascript/nodejs-integration-tests-best-practices&quot;&gt;Node.js testing - beyond the basics&lt;/a&gt; _&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.1 At the very least, write API (component) testing&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Most projects just don&#39;t have any automated testing due to short timetables or often the &#39;testing project&#39; ran out of control and was abandoned. For that reason, prioritize and start with API testing which is the easiest way to write and provides more coverage than unit testing (you may even craft API tests without code using tools like &lt;a href=&quot;https://www.getpostman.com/&quot;&gt;Postman&lt;/a&gt;). Afterwards, should you have more resources and time, continue with advanced test types like unit testing, DB testing, performance testing, etc&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; You may spend long days on writing unit tests to find out that you got only 20% system coverage&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.2 Include 3 parts in each test name&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Make the test speak at the requirements level so it&#39;s self-explanatory also to QA engineers and developers who are not familiar with the code internals. State in the test name what is being tested (unit under test), under what circumstances, and what is the expected result&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; A deployment just failed, a test named “Add product” failed. Does this tell you what exactly is malfunctioning?&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/testingandquality/3-parts-in-name.md&quot;&gt;&lt;strong&gt;Read More: Include 3 parts in each test name&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.3 Structure tests by the AAA pattern&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Structure your tests with 3 well-separated sections: Arrange, Act &amp;amp; Assert (AAA). The first part includes the test setup, then the execution of the unit under test, and finally the assertion phase. Following this structure guarantees that the reader spends no brain CPU on understanding the test plan&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Not only you spend long daily hours on understanding the main code, but now also what should have been the simple part of the day (testing) stretches your brain&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/testingandquality/aaa.md&quot;&gt;&lt;strong&gt;Read More: Structure tests by the AAA pattern&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.4 Ensure Node version is unified&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Use tools that encourage or enforce the same Node.js version across different environments and developers. Tools like &lt;a href=&quot;https://github.com/nvm-sh/nvm&quot;&gt;nvm&lt;/a&gt;, and &lt;a href=&quot;https://volta.sh/&quot;&gt;Volta&lt;/a&gt; allow specifying the project&#39;s version in a file so each team member can run a single command to conform with the project&#39;s version. Optionally, this definition can be replicated to CI and the production runtime (e.g., copy the specified value to .Dockerfile build and to the CI declaration file)&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; A developer might face or miss an error because she uses a different Node.js version than her teammates. Even worse - the production runtime might be different than the environment where tests were executed&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.5 Avoid global test fixtures and seeds, add data per-test&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; To prevent test coupling and easily reason about the test flow, each test should add and act on its own set of DB rows. Whenever a test needs to pull or assume the existence of some DB data - it must explicitly add that data and avoid mutating any other records&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Consider a scenario where deployment is aborted due to failing tests, team is now going to spend precious investigation time that ends in a sad conclusion: the system works well, the tests however interfere with each other and break the build&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/testingandquality/avoid-global-test-fixture.md&quot;&gt;&lt;strong&gt;Read More: Avoid global test fixtures&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.6 Tag your tests&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Different tests must run on different scenarios: quick smoke, IO-less, tests should run when a developer saves or commits a file, full end-to-end tests usually run when a new pull request is submitted, etc. This can be achieved by tagging tests with keywords like #cold #api #sanity so you can grep with your testing harness and invoke the desired subset. For example, this is how you would invoke only the sanity test group with &lt;a href=&quot;https://mochajs.org/&quot;&gt;Mocha&lt;/a&gt;: mocha --grep &#39;sanity&#39;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Running all the tests, including tests that perform dozens of DB queries, any time a developer makes a small change can be extremely slow and keeps developers away from running tests&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.7 Check your test coverage, it helps to identify wrong test patterns&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Code coverage tools like &lt;a href=&quot;https://github.com/istanbuljs/istanbuljs&quot;&gt;Istanbul&lt;/a&gt;/&lt;a href=&quot;https://github.com/istanbuljs/nyc&quot;&gt;NYC&lt;/a&gt; are great for 3 reasons: it comes for free (no effort is required to benefit this reports), it helps to identify a decrease in testing coverage, and last but not least it highlights testing mismatches: by looking at colored code coverage reports you may notice, for example, code areas that are never tested like catch clauses (meaning that tests only invoke the happy paths and not how the app behaves on errors). Set it to fail builds if the coverage falls under a certain threshold&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; There won&#39;t be any automated metric telling you when a large portion of your code is not covered by testing&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.8 Use production-like environment for e2e testing&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; End to end (e2e) testing which includes live data used to be the weakest link of the CI process as it depends on multiple heavy services like DB. Use an environment which is as close to your real production environment as possible like a-continue (Missed -continue here, needs content. Judging by the &lt;strong&gt;Otherwise&lt;/strong&gt; clause, this should mention docker-compose)&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Without docker-compose, teams must maintain a testing DB for each testing environment including developers&#39; machines, keep all those DBs in sync so test results won&#39;t vary across environments&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.9 Refactor regularly using static analysis tools&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Using static analysis tools helps by giving objective ways to improve code quality and keeps your code maintainable. You can add static analysis tools to your CI build to fail when it finds code smells. Its main selling points over plain linting are the ability to inspect quality in the context of multiple files (e.g. detect duplications), perform advanced analysis (e.g. code complexity), and follow the history and progress of code issues. Two examples of tools you can use are &lt;a href=&quot;https://www.sonarqube.org/&quot;&gt;Sonarqube&lt;/a&gt; (2,600+ &lt;a href=&quot;https://github.com/SonarSource/sonarqube&quot;&gt;stars&lt;/a&gt;) and &lt;a href=&quot;https://codeclimate.com/&quot;&gt;Code Climate&lt;/a&gt; (1,500+ &lt;a href=&quot;https://github.com/codeclimate/codeclimate&quot;&gt;stars&lt;/a&gt;).&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; With poor code quality, bugs and performance will always be an issue that no shiny new library or state of the art features can fix&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/testingandquality/refactoring.md&quot;&gt;&lt;strong&gt;Read More: Refactoring!&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.10 Mock responses of external HTTP services&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Use network mocking tools to simulate responses of external collaborators&#39; services that are approached over the network (e.g., REST, Graph). This is imperative not only to isolate the component under test but mostly to simulate non-happy path flows. Tools like &lt;a href=&quot;https://github.com/nock/nock&quot;&gt;nock&lt;/a&gt; (in-process) or &lt;a href=&quot;https://www.mock-server.com/&quot;&gt;Mock-Server&lt;/a&gt; allow defining a specific response of external service in a single line of code. Remember to simulate also errors, delays, timeouts, and any other event that is likely to happen in production&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Allowing your component to reach real external services instances will likely result in naive tests that mostly cover happy paths. The tests might also be flaky and slow&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/testingandquality/mock-external-services.md&quot;&gt;&lt;strong&gt;Read More: Mock external services&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.11 Test your middlewares in isolation&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; When a middleware holds some immense logic that spans many requests, it is worth testing it in isolation without waking up the entire web framework. This can be easily achieved by stubbing and spying on the {req, res, next} objects&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; A bug in Express middleware === a bug in all or most requests&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/testingandquality/test-middlewares.md&quot;&gt;&lt;strong&gt;Read More: Test middlewares in isolation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.12 Specify a port in production, randomize in testing&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; When testing against the API, it&#39;s common and desirable to initialize the web server inside the tests. Let the server randomize the web server port in testing to prevent collisions. If you&#39;re using Node.js http server (used by most frameworks), doing so demands nothing but passing a port number zero - this will randomize an available port&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Specifying a fixed port will prevent two testing processes from running at the same time. Most of the modern test runners run with multiple processes by default&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/testingandquality/randomize-port.md&quot;&gt;&lt;strong&gt;Read More: Randomize a port for testing&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 4.13 Test the five possible outcomes&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; When testing a flow, ensure to cover five potential categories. Any time some action is triggered (e.g., API call), a reaction occurs, a meaningful &lt;strong&gt;outcome&lt;/strong&gt; is produced and calls for testing. There are five possible outcome types for every flow: a response, a visible state change (e.g., DB), an outgoing API call, a new message in a queue, and an observability call (e.g., logging, metric). See a &lt;a href=&quot;https://testjavascript.com/wp-content/uploads/2021/10/the-backend-checklist.pdf&quot;&gt;checklist here&lt;/a&gt;. Each type of outcome comes with unique challenges and techniques to mitigate those challenges - we have a dedicated guide about this topic: &lt;a href=&quot;https://github.com/testjavascript/nodejs-integration-tests-best-practices&quot;&gt;Node.js testing - beyond the basics&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Consider a case when testing the addition of a new product to the system. It&#39;s common to see tests that assert on a valid response only. What if the product was failed to persist regardless of the positive response? what if when adding a new product demands calling some external service, or putting a message in the queue - shouldn&#39;t the test assert these outcomes as well? It&#39;s easy to overlook various paths, this is where a &lt;a href=&quot;https://testjavascript.com/wp-content/uploads/2021/10/the-backend-checklist.pdf&quot;&gt;checklist comes handy&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/testingandquality/test-five-outcomes.md&quot;&gt;&lt;strong&gt;Read More: Test five outcomes&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#table-of-contents&quot;&gt;⬆ Return to top&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;code&gt;5. Going To Production Practices&lt;/code&gt;&lt;/h1&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.1. Monitoring&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Monitoring is a game of finding out issues before customers do – obviously this should be assigned unprecedented importance. The market is overwhelmed with offers thus consider starting with defining the basic metrics you must follow (my suggestions inside), then go over additional fancy features and choose the solution that ticks all boxes. In any case, the 4 layers of observability must be covered: uptime, metrics with focus on user-facing symptoms and Node.js technical metrics like event loop lag, distributed flows measurement with Open Telemetry and logging. Click ‘Read More’ below for an overview of the solutions&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Failure === disappointed customers. Simple&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/monitoring.md&quot;&gt;&lt;strong&gt;Read More: Monitoring!&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.2. Increase the observability using smart logging&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Logs can be a dumb warehouse of debug statements or the enabler of a beautiful dashboard that tells the story of your app. Plan your logging platform from day 1: how logs are collected, stored and analyzed to ensure that the desired information (e.g. error rate, following an entire transaction through services and servers, etc) can really be extracted&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; You end up with a black box that is hard to reason about, then you start re-writing all logging statements to add additional information&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/smartlogging.md&quot;&gt;&lt;strong&gt;Read More: Increase transparency using smart logging&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.3. Delegate anything possible (e.g. gzip, SSL) to a reverse proxy&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Node is quite bad at doing CPU intensive tasks like gzipping, SSL termination, etc. You should use specialized infrastructure like nginx, HAproxy or cloud vendor services instead&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Your poor single thread will stay busy doing infrastructural tasks instead of dealing with your application core and performance will degrade accordingly&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/delegatetoproxy.md&quot;&gt;&lt;strong&gt;Read More: Delegate anything possible (e.g. gzip, SSL) to a reverse proxy&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.4. Lock dependencies&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Your code must be identical across all environments, but without a special lockfile npm lets dependencies drift across environments. Ensure to commit your package-lock.json so all the environments will be identical&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; QA will thoroughly test the code and approve a version that will behave differently in production. Even worse, different servers in the same production cluster might run different code&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/lockdependencies.md&quot;&gt;&lt;strong&gt;Read More: Lock dependencies&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.5. Guard process uptime using the right tool&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The process must go on and get restarted upon failures. Modern runtime platforms like Docker-ized platforms (e.g. Kubernetes), and Serverless take care for this automatically. When the app is hosted on a bare metal server, one must take care for a process management tools like &lt;a href=&quot;https://systemd.io/&quot;&gt;systemd&lt;/a&gt;. Avoid including a custom process management tool in a modern platform that monitors an app instance (e.g., Kubernetes) - doing so will hide failures from the infrastructure. When the underlying infrastructure is not aware of errors, it can&#39;t perform useful mitigation steps like re-placing the instance in a different location&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Running dozens of instances without a clear strategy and too many tools together (cluster management, docker, PM2) might lead to DevOps chaos&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/guardprocess.md&quot;&gt;&lt;strong&gt;Read More: Guard process uptime using the right tool&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.6. Utilize all CPU cores&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; At its basic form, a Node app runs on a single CPU core while all others are left idling. It’s your duty to replicate the Node process and utilize all CPUs. Most of the modern run-times platform (e.g., Kubernetes) allow replicating instances of the app but they won&#39;t verify that all cores are utilized - this is your duty. If the app is hosted on a bare server, it&#39;s also your duty to use some process replication solution (e.g. systemd)&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Your app will likely utilize only 25% of its available resources(!) or even less. Note that a typical server has 4 CPU cores or more, naive deployment of Node.js utilizes only 1 (even using PaaS services like AWS beanstalk!)&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/utilizecpu.md&quot;&gt;&lt;strong&gt;Read More: Utilize all CPU cores&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.7. Create a ‘maintenance endpoint’&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Expose a set of system-related information, like memory usage and REPL, etc in a secured API. Although it’s highly recommended to rely on standard and battle-tested tools, some valuable information and operations are easier done using code&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; You’ll find that you’re performing many “diagnostic deploys” – shipping code to production only to extract some information for diagnostic purposes&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/createmaintenanceendpoint.md&quot;&gt;&lt;strong&gt;Read More: Create a ‘maintenance endpoint’&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.8. Discover the unknowns using APM products&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Consider adding another safety layer to the production stack - APM. While the majority of symptoms and causes can be detected using traditional monitoring techniques, in a distributed system there is more than meets the eye. Application monitoring and performance products (a.k.a. APM) can auto-magically go beyond traditional monitoring and provide additional layer of discovery and developer-experience. For example, some APM products can highlight a transaction that loads too slow on the &lt;strong&gt;end-user&#39;s side&lt;/strong&gt; while suggesting the root cause. APMs also provide more context for developers who try to troubleshoot a log error by showing what was the server busy with when the error occurred. To name a few example&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; You might spend great effort on measuring API performance and downtimes, probably you’ll never be aware which is your slowest code parts under real-world scenario and how these affect the UX&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/apmproducts.md&quot;&gt;&lt;strong&gt;Read More: Discover errors and downtime using APM products&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.9. Make your code production-ready&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Code with the end in mind, plan for production from day 1. This sounds a bit vague so I’ve compiled a few development tips that are closely related to production maintenance (click &#39;Read More&#39;)&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; A world champion IT/DevOps guy won’t save a system that is badly written&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/productioncode.md&quot;&gt;&lt;strong&gt;Read More: Make your code production-ready&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.10. Measure and guard the memory usage&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Node.js has controversial relationships with memory: the v8 engine has soft limits on memory usage (1.4GB) and there are known paths to leak memory in Node’s code – thus watching Node’s process memory is a must. In small apps, you may gauge memory periodically using shell commands but in medium-large apps consider baking your memory watch into a robust monitoring system&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Your process memory might leak a hundred megabytes a day like how it happened at &lt;a href=&quot;https://www.joyent.com/blog/walmart-node-js-memory-leak&quot;&gt;Walmart&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/measurememory.md&quot;&gt;&lt;strong&gt;Read More: Measure and guard the memory usage&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.11. Get your frontend assets out of Node&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Serve frontend content using a specialized infrastructure (nginx, S3, CDN) because Node performance gets hurt when dealing with many static files due to its single-threaded model. One exception to this guideline is when doing server-side rendering&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Your single Node thread will be busy streaming hundreds of html/images/angular/react files instead of allocating all its resources for the task it was born for – serving dynamic content&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/frontendout.md&quot;&gt;&lt;strong&gt;Read More: Get your frontend assets out of Node&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.12. Strive to be stateless&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Store any type of &lt;em&gt;data&lt;/em&gt; (e.g. user sessions, cache, uploaded files) within external data stores. When the app holds data in-process this adds additional layer of maintenance complexity like routing users to the same instance and higher cost of restarting a process. To enforce and encourage a stateless approach, most modern runtime platforms allows &#39;reapp-ing&#39; instances periodically&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Failure at a given server will result in application downtime instead of just killing a faulty machine. Moreover, scaling-out elasticity will get more challenging due to the reliance on a specific server&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/bestateless.md&quot;&gt;&lt;strong&gt;Read More: Be stateless, kill your Servers almost every day&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.13. Use tools that automatically detect vulnerabilities&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Even the most reputable dependencies such as Express have known vulnerabilities (from time to time) that can put a system at risk. This can be easily tamed using community and commercial tools that constantly check for vulnerabilities and warn (locally or at GitHub), some can even patch them immediately&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Keeping your code clean from vulnerabilities without dedicated tools will require you to constantly follow online publications about new threats. Quite tedious&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/detectvulnerabilities.md&quot;&gt;&lt;strong&gt;Read More: Use tools that automatically detect vulnerabilities&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.14. Assign a transaction id to each log statement&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Assign the same identifier, transaction-id: uuid(), to each log entry within a single request (also known as correlation-id/tracing-id/request-context). Then when inspecting errors in logs, easily conclude what happened before and after. Node has a built-in mechanism, &lt;a href=&quot;https://nodejs.org/api/async_context.html&quot;&gt;AsyncLocalStorage&lt;/a&gt;, for keeping the same context across asynchronous calls. see code examples inside&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Looking at a production error log without the context – what happened before – makes it much harder and slower to reason about the issue&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/assigntransactionid.md&quot;&gt;&lt;strong&gt;Read More: Assign ‘TransactionId’ to each log statement&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.15. Set &lt;code&gt;NODE_ENV=production&lt;/code&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Set the environment variable &lt;code&gt;NODE_ENV&lt;/code&gt; to ‘production’ or ‘development’ to flag whether production optimizations should get activated – some npm packages determine the current environment and optimize their code for production&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Omitting this simple property might greatly degrade performance when dealing with some specific libraries like Express server-side rendering&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/setnodeenv.md&quot;&gt;&lt;strong&gt;Read More: Set NODE_ENV=production&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.16. Design automated, atomic and zero-downtime deployments&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Research shows that teams who perform many deployments lower the probability of severe production issues. Fast and automated deployments that don’t require risky manual steps and service downtime significantly improve the deployment process. You should probably achieve this using Docker combined with CI tools as they became the industry standard for streamlined deployment&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Long deployments -&amp;gt; production downtime &amp;amp; human-related error -&amp;gt; team unconfident in making deployment -&amp;gt; fewer deployments and features&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.17. Use an LTS release of Node.js&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Ensure you are using an LTS version of Node.js to receive critical bug fixes, security updates and performance improvements&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Newly discovered bugs or vulnerabilities could be used to exploit an application running in production, and your application may become unsupported by various modules and harder to maintain&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/LTSrelease.md&quot;&gt;&lt;strong&gt;Read More: Use an LTS release of Node.js&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.18. Log to stdout, avoid specifying log destination within the app&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;📝 #updated&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Log destinations should not be hard-coded by developers within the application code, but instead should be defined by the execution environment the application runs in. Developers should write logs to &lt;code&gt;stdout&lt;/code&gt; using a logger utility and then let the execution environment (container, server, etc.) pipe the &lt;code&gt;stdout&lt;/code&gt; stream to the appropriate destination (i.e. Splunk, Graylog, ElasticSearch, etc.).&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; If developers set the log routing, less flexibility is left for the ops professional who wishes to customize it. Beyond this, if the app tries to log directly to a remote location (e.g., Elastic Search), in case of panic or crash - further logs that might explain the problem won&#39;t arrive&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/logrouting.md&quot;&gt;&lt;strong&gt;Read More: Log Routing&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 5.19. Install your packages with &lt;code&gt;npm ci&lt;/code&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Run &lt;code&gt;npm ci&lt;/code&gt; to strictly do a clean install of your dependencies matching package.json and package-lock.json. Obviously production code must use the exact version of the packages that were used for testing. While package-lock.json file sets strict version for dependencies, in case of mismatch with the file package.json, the command &#39;npm install&#39; will treat package.json as the source of truth. On the other hand, the command &#39;npm ci&#39; will exit with error in case of mismatch between these files&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; QA will thoroughly test the code and approve a version that will behave differently in production. Even worse, different servers in the same production cluster might run different code.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/production/installpackageswithnpmci.md&quot;&gt;&lt;strong&gt;Read More: Use npm ci&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#table-of-contents&quot;&gt;⬆ Return to top&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;code&gt;6. Security Best Practices&lt;/code&gt;&lt;/h1&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;img src=&quot;https://img.shields.io/badge/OWASP%20Threats-Top%2010-green.svg?sanitize=true&quot; alt=&quot;54 items&quot; /&gt; 
&lt;/div&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.1. Embrace linter security rules&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A1-Injection&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20XSS%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Make use of security-related linter plugins such as &lt;a href=&quot;https://github.com/nodesecurity/eslint-plugin-security&quot;&gt;eslint-plugin-security&lt;/a&gt; to catch security vulnerabilities and issues as early as possible, preferably while they&#39;re being coded. This can help catching security weaknesses like using eval, invoking a child process or importing a module with a string literal (e.g. user input). Click &#39;Read more&#39; below to see code examples that will get caught by a security linter&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; What could have been a straightforward security weakness during development becomes a major issue in production. Also, the project may not follow consistent code security practices, leading to vulnerabilities being introduced, or sensitive secrets committed into remote repositories&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/lintrules.md&quot;&gt;&lt;strong&gt;Read More: Lint rules&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.2. Limit concurrent requests using a middleware&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Denial_of_Service&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20DDOS%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; DOS attacks are very popular and relatively easy to conduct. Implement rate limiting using an external service such as cloud load balancers, cloud firewalls, nginx, &lt;a href=&quot;https://www.npmjs.com/package/rate-limiter-flexible&quot;&gt;rate-limiter-flexible&lt;/a&gt; package, or (for smaller and less critical apps) a rate-limiting middleware (e.g. &lt;a href=&quot;https://www.npmjs.com/package/express-rate-limit&quot;&gt;express-rate-limit&lt;/a&gt;)&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; An application could be subject to an attack resulting in a denial of service where real users receive a degraded or unavailable service.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/limitrequests.md&quot;&gt;&lt;strong&gt;Read More: Implement rate limiting&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.3 Extract secrets from config files or use packages to encrypt them&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A3-Sensitive_Data_Exposure&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A3:Sensitive%20Data%20Exposure%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Never store plain-text secrets in configuration files or source code. Instead, make use of secret-management systems like Vault products, Kubernetes/Docker Secrets, or using environment variables. As a last resort, secrets stored in source control must be encrypted and managed (rolling keys, expiring, auditing, etc). Make use of pre-commit/push hooks to prevent committing secrets accidentally&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Source control, even for private repositories, can mistakenly be made public, at which point all secrets are exposed. Access to source control for an external party will inadvertently provide access to related systems (databases, apis, services, etc).&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/secretmanagement.md&quot;&gt;&lt;strong&gt;Read More: Secret management&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.4. Prevent query injection vulnerabilities with ORM/ODM libraries&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A1-Injection&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; To prevent SQL/NoSQL injection and other malicious attacks, always make use of an ORM/ODM or a database library that escapes data or supports named or indexed parameterized queries, and takes care of validating user input for expected types. Never just use JavaScript template strings or string concatenation to inject values into queries as this opens your application to a wide spectrum of vulnerabilities. All the reputable Node.js data access libraries (e.g. &lt;a href=&quot;https://github.com/sequelize/sequelize&quot;&gt;Sequelize&lt;/a&gt;, &lt;a href=&quot;https://github.com/tgriesser/knex&quot;&gt;Knex&lt;/a&gt;, &lt;a href=&quot;https://github.com/Automattic/mongoose&quot;&gt;mongoose&lt;/a&gt;) have built-in protection against injection attacks.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Unvalidated or unsanitized user input could lead to operator injection when working with MongoDB for NoSQL, and not using a proper sanitization system or ORM will easily allow SQL injection attacks, creating a giant vulnerability.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/ormodmusage.md&quot;&gt;&lt;strong&gt;Read More: Query injection prevention using ORM/ODM libraries&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.5. Collection of generic security best practices&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; This is a collection of security advice that is not related directly to Node.js - the Node implementation is not much different than any other language. Click read more to skim through.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/commonsecuritybestpractices.md&quot;&gt;&lt;strong&gt;Read More: Common security best practices&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.6. Adjust the HTTP response headers for enhanced security&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Your application should be using secure headers to prevent attackers from using common attacks like cross-site scripting (XSS), clickjacking and other malicious attacks. These can be configured easily using modules like &lt;a href=&quot;https://www.npmjs.com/package/helmet&quot;&gt;helmet&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Attackers could perform direct attacks on your application&#39;s users, leading to huge security vulnerabilities&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/secureheaders.md&quot;&gt;&lt;strong&gt;Read More: Using secure headers in your application&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.7. Constantly and automatically inspect for vulnerable dependencies&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A9-Using_Components_with_Known_Vulnerabilities&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A9:Known%20Vulnerabilities%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; With the npm ecosystem it is common to have many dependencies for a project. Dependencies should always be kept in check as new vulnerabilities are found. Use tools like &lt;a href=&quot;https://docs.npmjs.com/cli/audit&quot;&gt;npm audit&lt;/a&gt; or &lt;a href=&quot;https://snyk.io/&quot;&gt;snyk&lt;/a&gt; to track, monitor and patch vulnerable dependencies. Integrate these tools with your CI setup so you catch a vulnerable dependency before it makes it to production.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; An attacker could detect your web framework and attack all its known vulnerabilities.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/dependencysecurity.md&quot;&gt;&lt;strong&gt;Read More: Dependency security&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.8. Protect Users&#39; Passwords/Secrets using bcrypt or scrypt&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A2-Broken_Authentication&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A9:Broken%20Authentication%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Passwords or secrets (e.g. API keys) should be stored using a secure hash + salt function like &lt;code&gt;bcrypt&lt;/code&gt;,&lt;code&gt;scrypt&lt;/code&gt;, or worst case &lt;code&gt;pbkdf2&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Passwords and secrets that are stored without using a secure function are vulnerable to brute forcing and dictionary attacks that will lead to their disclosure eventually.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/userpasswords.md&quot;&gt;&lt;strong&gt;Read More: User Passwords&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.9. Escape HTML, JS and CSS output&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A7:XSS%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Untrusted data that is sent down to the browser might get executed instead of just being displayed, this is commonly referred as a cross-site-scripting (XSS) attack. Mitigate this by using dedicated libraries that explicitly mark the data as pure content that should never get executed (i.e. encoding, escaping)&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; An attacker might store malicious JavaScript code in your DB which will then be sent as-is to the poor clients&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/escape-output.md&quot;&gt;&lt;strong&gt;Read More: Escape output&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.10. Validate incoming JSON schemas&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%25E2%259C%2594%2520OWASP%2520Threats%2520-%2520A7:%20XSS%2520-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A8-Insecure_Deserialization&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A8:Insecured%20Deserialization%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Validate the incoming requests&#39; body payload and ensure it meets expectations, fail fast if it doesn&#39;t. To avoid tedious validation coding within each route you may use lightweight JSON-based validation schemas such as &lt;a href=&quot;https://www.npmjs.com/package/jsonschema&quot;&gt;jsonschema&lt;/a&gt; or &lt;a href=&quot;https://www.npmjs.com/package/joi&quot;&gt;joi&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Your generosity and permissive approach greatly increases the attack surface and encourages the attacker to try out many inputs until they find some combination to crash the application&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/validation.md&quot;&gt;&lt;strong&gt;Read More: Validate incoming JSON schemas&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.11. Support blocklisting JWTs&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A2-Broken_Authentication&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A9:Broken%20Authentication%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; When using JSON Web Tokens (for example, with &lt;a href=&quot;https://github.com/jaredhanson/passport&quot;&gt;Passport.js&lt;/a&gt;), by default there&#39;s no mechanism to revoke access from issued tokens. Once you discover some malicious user activity, there&#39;s no way to stop them from accessing the system as long as they hold a valid token. Mitigate this by implementing a blocklist of untrusted tokens that are validated on each request.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Expired, or misplaced tokens could be used maliciously by a third party to access an application and impersonate the owner of the token.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/expirejwt.md&quot;&gt;&lt;strong&gt;Read More: Blocklist JSON Web Tokens&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.12. Prevent brute-force attacks against authorization&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A2-Broken_Authentication&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A9:Broken%20Authentication%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; A simple and powerful technique is to limit authorization attempts using two metrics:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;The first is number of consecutive failed attempts by the same user unique ID/name and IP address.&lt;/li&gt; 
 &lt;li&gt;The second is number of failed attempts from an IP address over some long period of time. For example, block an IP address if it makes 100 failed attempts in one day.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; An attacker can issue unlimited automated password attempts to gain access to privileged accounts on an application&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/login-rate-limit.md&quot;&gt;&lt;strong&gt;Read More: Login rate limiting&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.13. Run Node.js as non-root user&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A5-Broken_Access_Control&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A5:Broken%20Access%20Access%20Control-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; There is a common scenario where Node.js runs as a root user with unlimited permissions. For example, this is the default behaviour in Docker containers. It&#39;s recommended to create a non-root user and either bake it into the Docker image (examples given below) or run the process on this user&#39;s behalf by invoking the container with the flag &quot;-u username&quot;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; An attacker who manages to run a script on the server gets unlimited power over the local machine (e.g. change iptable and re-route traffic to their server)&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/non-root-user.md&quot;&gt;&lt;strong&gt;Read More: Run Node.js as non-root user&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.14. Limit payload size using a reverse-proxy or a middleware&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A8-Insecure_Deserialization&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A8:Insecured%20Deserialization%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A1-Injection&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20DDOS%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The bigger the body payload is, the harder your single thread works in processing it. This is an opportunity for attackers to bring servers to their knees without tremendous amount of requests (DOS/DDOS attacks). Mitigate this limiting the body size of incoming requests on the edge (e.g. firewall, ELB) or by configuring &lt;a href=&quot;https://github.com/expressjs/body-parser&quot;&gt;express body parser&lt;/a&gt; to accept only small-size payloads&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Your application will have to deal with large requests, unable to process the other important work it has to accomplish, leading to performance implications and vulnerability towards DOS attacks&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/requestpayloadsizelimit.md&quot;&gt;&lt;strong&gt;Read More: Limit payload size&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.15. Avoid JavaScript eval statements&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A7:XSS%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A1-Injection&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A4-XML_External_Entities_(XXE)&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A4:External%20Entities%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;code&gt;eval&lt;/code&gt; is evil as it allows executing custom JavaScript code during run time. This is not just a performance concern but also an important security concern due to malicious JavaScript code that may be sourced from user input. Another language feature that should be avoided is &lt;code&gt;new Function&lt;/code&gt; constructor. &lt;code&gt;setTimeout&lt;/code&gt; and &lt;code&gt;setInterval&lt;/code&gt; should never be passed dynamic JavaScript code either.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Malicious JavaScript code finds a way into text passed into &lt;code&gt;eval&lt;/code&gt; or other real-time evaluating JavaScript language functions, and will gain complete access to JavaScript permissions on the page. This vulnerability is often manifested as an XSS attack.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/avoideval.md&quot;&gt;&lt;strong&gt;Read More: Avoid JavaScript eval statements&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.16. Prevent evil RegEx from overloading your single thread execution&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Denial_of_Service&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20DDOS%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Regular Expressions, while being handy, pose a real threat to JavaScript applications at large, and the Node.js platform in particular. A user input for text to match might require an outstanding amount of CPU cycles to process. RegEx processing might be inefficient to an extent that a single request that validates 10 words can block the entire event loop for 6 seconds and set the CPU on 🔥. For that reason, prefer third-party validation packages like &lt;a href=&quot;https://github.com/chriso/validator.js&quot;&gt;validator.js&lt;/a&gt; instead of writing your own Regex patterns, or make use of &lt;a href=&quot;https://github.com/substack/safe-regex&quot;&gt;safe-regex&lt;/a&gt; to detect vulnerable regex patterns&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Poorly written regexes could be susceptible to Regular Expression DoS attacks that will block the event loop completely. For example, the popular &lt;code&gt;moment&lt;/code&gt; package was found vulnerable with malicious RegEx usage in November of 2017&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/regex.md&quot;&gt;&lt;strong&gt;Read More: Prevent malicious RegEx&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.17. Avoid module loading using a variable&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A7:XSS%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A1-Injection&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A4-XML_External_Entities_(XXE)&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A4:External%20Entities%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Avoid requiring/importing another file with a path that was given as parameter due to the concern that it could have originated from user input. This rule can be extended for accessing files in general (i.e. &lt;code&gt;fs.readFile()&lt;/code&gt;) or other sensitive resource access with dynamic variables originating from user input. &lt;a href=&quot;https://www.npmjs.com/package/eslint-plugin-security&quot;&gt;Eslint-plugin-security&lt;/a&gt; linter can catch such patterns and warn early enough&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Malicious user input could find its way to a parameter that is used to require tampered files, for example, a previously uploaded file on the file system, or access already existing system files.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/safemoduleloading.md&quot;&gt;&lt;strong&gt;Read More: Safe module loading&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.18. Run unsafe code in a sandbox&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A7:XSS%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A1-Injection&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A4-XML_External_Entities_(XXE)&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A4:External%20Entities%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; When tasked to run external code that is given at run-time (e.g. plugin), use any sort of &#39;sandbox&#39; execution environment that isolates and guards the main code against the plugin. This can be achieved using a dedicated process (e.g. &lt;code&gt;cluster.fork()&lt;/code&gt;), serverless environment or dedicated npm packages that act as a sandbox&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; A plugin can attack through an endless variety of options like infinite loops, memory overloading, and access to sensitive process environment variables&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/sandbox.md&quot;&gt;&lt;strong&gt;Read More: Run unsafe code in a sandbox&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.19. Take extra care when working with child processes&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A7:XSS%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A1-Injection&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A4-XML_External_Entities_(XXE)&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A4:External%20Entities%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Avoid using child processes when possible and validate and sanitize input to mitigate shell injection attacks if you still have to. Prefer using &lt;code&gt;child_process.execFile&lt;/code&gt; which by definition will only execute a single command with a set of attributes and will not allow shell parameter expansion.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Naive use of child processes could result in remote command execution or shell injection attacks due to malicious user input passed to an unsanitized system command.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/childprocesses.md&quot;&gt;&lt;strong&gt;Read More: Be cautious when working with child processes&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.20. Hide error details from clients&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; An integrated express error handler hides the error details by default. However, great are the chances that you implement your own error handling logic with custom Error objects (considered by many as a best practice). If you do so, ensure not to return the entire Error object to the client, which might contain some sensitive application details&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Sensitive application details such as server file paths, third party modules in use, and other internal workflows of the application which could be exploited by an attacker, could be leaked from information found in a stack trace&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/hideerrors.md&quot;&gt;&lt;strong&gt;Read More: Hide error details from client&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.21. Configure 2FA for npm or Yarn&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Any step in the development chain should be protected with MFA (multi-factor authentication), npm/Yarn are a sweet opportunity for attackers who can get their hands on some developer&#39;s password. Using developer credentials, attackers can inject malicious code into libraries that are widely installed across projects and services. Maybe even across the web if published in public. Enabling 2-factor-authentication in npm leaves almost zero chances for attackers to alter your package code.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; &lt;a href=&quot;https://medium.com/@oprearocks/eslint-backdoor-what-it-is-and-how-to-fix-the-issue-221f58f1a8c8&quot;&gt;Have you heard about the eslint developer whose password was hijacked?&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.22. Modify session middleware settings&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Each web framework and technology has its known weaknesses - telling an attacker which web framework we use is a great help for them. Using the default settings for session middlewares can expose your app to module- and framework-specific hijacking attacks in a similar way to the &lt;code&gt;X-Powered-By&lt;/code&gt; header. Try hiding anything that identifies and reveals your tech stack (E.g. Node.js, express)&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Cookies could be sent over insecure connections, and an attacker might use session identification to identify the underlying framework of the web application, as well as module-specific vulnerabilities&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/sessions.md&quot;&gt;&lt;strong&gt;Read More: Cookie and session security&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.23. Avoid DOS attacks by explicitly setting when a process should crash&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Denial_of_Service&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20DDOS%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The Node process will crash when errors are not handled. Many best practices even recommend to exit even though an error was caught and got handled. Express, for example, will crash on any asynchronous error - unless you wrap routes with a catch clause. This opens a very sweet attack spot for attackers who recognize what input makes the process crash and repeatedly send the same request. There&#39;s no instant remedy for this but a few techniques can mitigate the pain: Alert with critical severity anytime a process crashes due to an unhandled error, validate the input and avoid crashing the process due to invalid user input, wrap all routes with a catch and consider not to crash when an error originated within a request (as opposed to what happens globally)&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; This is just an educated guess: given many Node.js applications, if we try passing an empty JSON body to all POST requests - a handful of applications will crash. At that point, we can just repeat sending the same request to take down the applications with ease&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.24. Prevent unsafe redirects&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A1-Injection&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Redirects that do not validate user input can enable attackers to launch phishing scams, steal user credentials, and perform other malicious actions.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; If an attacker discovers that you are not validating external, user-supplied input, they may exploit this vulnerability by posting specially-crafted links on forums, social media, and other public places to get users to click it.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/saferedirects.md&quot;&gt;&lt;strong&gt;Read More: Prevent unsafe redirects&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.25. Avoid publishing secrets to the npm registry&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Precautions should be taken to avoid the risk of accidentally publishing secrets to public npm registries. An &lt;code&gt;.npmignore&lt;/code&gt; file can be used to ignore specific files or folders, or the &lt;code&gt;files&lt;/code&gt; array in &lt;code&gt;package.json&lt;/code&gt; can act as an allow list.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Your project&#39;s API keys, passwords or other secrets are open to be abused by anyone who comes across them, which may result in financial loss, impersonation, and other risks.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/security/avoid_publishing_secrets.md&quot;&gt;&lt;strong&gt;Read More: Avoid publishing secrets&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.26 Inspect for outdated packages&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Use your preferred tool (e.g. &lt;code&gt;npm outdated&lt;/code&gt; or &lt;a href=&quot;https://www.npmjs.com/package/npm-check-updates&quot;&gt;npm-check-updates&lt;/a&gt;) to detect installed outdated packages, inject this check into your CI pipeline and even make a build fail in a severe scenario. For example, a severe scenario might be when an installed package is 5 patch commits behind (e.g. local version is 1.3.1 and repository version is 1.3.8) or it is tagged as deprecated by its author - kill the build and prevent deploying this version&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Your production will run packages that have been explicitly tagged by their author as risky&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 6.27. Import built-in modules using the &#39;node:&#39; protocol&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/%25E2%259C%2594%2520A06:2021%20%E2%80%93%20Vulnerable%20and%20Outdated%20Components-green.svg?sanitize=true&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Import or require built-in Node.js modules using the &#39;node protocol&#39; syntax:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import { functionName } from &quot;node:module&quot;; // note that &#39;node:&#39; prefix
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import { createServer } from &quot;node:http&quot;;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This style ensures that there is no ambiguity with global npm packages and makes it clear for the reader that the code refers to a well-trusted official module. This style can be enforced with the eslint rule &lt;a href=&quot;https://github.com/sindresorhus/eslint-plugin-unicorn/raw/main/docs/rules/prefer-node-protocol.md&quot;&gt;&#39;prefer-node-protocol&#39;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Using the import syntax without &#39;node:&#39; prefix opens the door for &lt;a href=&quot;https://en.wikipedia.org/wiki/Typosquatting&quot;&gt;typosquatting attacks&lt;/a&gt; where one could mistakenly mistype a module name (e.g., &#39;event&#39; instead of &#39;events) and get a malicious package that was built only to trick users into installing them&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#table-of-contents&quot;&gt;⬆ Return to top&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;code&gt;7. Draft: Performance Best Practices&lt;/code&gt;&lt;/h1&gt; 
&lt;h2&gt;Our contributors are working on this section. &lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/issues/256&quot;&gt;Would you like to join?&lt;/a&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 7.1. Don&#39;t block the event loop&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Avoid CPU intensive tasks as they will block the mostly single-threaded Event Loop and offload those to a dedicated thread, process or even a different technology based on the context.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; As the Event Loop is blocked, Node.js will be unable to handle other request thus causing delays for concurrent users. &lt;strong&gt;3000 users are waiting for a response, the content is ready to be served, but one single request blocks the server from dispatching the results back&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/performance/block-loop.md&quot;&gt;&lt;strong&gt;Read More: Do not block the event loop&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 7.2. Prefer native JS methods over user-land utils like Lodash&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; It&#39;s often more penalising to use utility libraries like &lt;code&gt;lodash&lt;/code&gt; and &lt;code&gt;underscore&lt;/code&gt; over native methods as it leads to unneeded dependencies and slower performance. Bear in mind that with the introduction of the new V8 engine alongside the new ES standards, native methods were improved in such a way that it&#39;s now about 50% more performant than utility libraries.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; You&#39;ll have to maintain less performant projects where you could have simply used what was &lt;strong&gt;already&lt;/strong&gt; available or dealt with a few more lines in exchange of a few more files.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/performance/nativeoverutil.md&quot;&gt;&lt;strong&gt;Read More: Native over user land utils&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#table-of-contents&quot;&gt;⬆ Return to top&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;&lt;code&gt;8. Docker Best Practices&lt;/code&gt;&lt;/h1&gt; 
&lt;p&gt;🏅 Many thanks to &lt;a href=&quot;https://github.com/BretFisher&quot;&gt;Bret Fisher&lt;/a&gt; from whom we learned many of the following practices&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.1 Use multi-stage builds for leaner and more secure Docker images&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Use multi-stage build to copy only necessary production artifacts. A lot of build-time dependencies and files are not needed for running your application. With multi-stage builds these resources can be used during build while the runtime environment contains only what&#39;s necessary. Multi-stage builds are an easy way to get rid of overweight and security threats.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Larger images will take longer to build and ship, build-only tools might contain vulnerabilities and secrets only meant for the build phase might be leaked.&lt;/p&gt; 
&lt;h3&gt;Example Dockerfile for multi-stage builds&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;FROM node:14.4.0 AS build

COPY . .
RUN npm ci &amp;amp;&amp;amp; npm run build


FROM node:slim-14.4.0

USER node
EXPOSE 8080

COPY --from=build /home/node/app/dist /home/node/app/package.json /home/node/app/package-lock.json ./
RUN npm ci --production

CMD [ &quot;node&quot;, &quot;dist/app.js&quot; ]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/multi_stage_builds.md&quot;&gt;&lt;strong&gt;Read More: Use multi-stage builds&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.2. Bootstrap using &lt;code&gt;node&lt;/code&gt; command, avoid &lt;code&gt;npm start&lt;/code&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Use &lt;code&gt;CMD [&#39;node&#39;,&#39;server.js&#39;]&lt;/code&gt; to start your app, avoid using npm scripts which don&#39;t pass OS signals to the code. This prevents problems with child-processes, signal handling, graceful shutdown and having zombie processes&lt;/p&gt; 
&lt;p&gt;Update: &lt;a href=&quot;https://docs.npmjs.com/cli/v7/using-npm/changelog#706-2020-10-27&quot;&gt;Starting from npm 7, npm claim&lt;/a&gt; to pass signals. We follow and will update accordingly&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; When no signals are passed, your code will never be notified about shutdowns. Without this, it will lose its chance to close properly possibly losing current requests and/or data&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/bootstrap-using-node.md&quot;&gt;&lt;strong&gt;Read More: Bootstrap container using node command, avoid npm start&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.3. Let the Docker runtime handle replication and uptime&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; When using a Docker run time orchestrator (e.g., Kubernetes), invoke the Node.js process directly without intermediate process managers or custom code that replicate the process (e.g. PM2, Cluster module). The runtime platform has the highest amount of data and visibility for making placement decision - It knows best how many processes are needed, how to spread them and what to do in case of crashes&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Container keeps crashing due to lack of resources will get restarted indefinitely by the process manager. Should Kubernetes be aware of that, it could relocate it to a different roomy instance&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/restart-and-replicate-processes.md&quot;&gt;&lt;strong&gt;Read More: Let the Docker orchestrator restart and replicate processes&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.4. Use .dockerignore to prevent leaking secrets&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Include a &lt;code&gt;.dockerignore&lt;/code&gt; file that filters out common secret files and development artifacts. By doing so, you might prevent secrets from leaking into the image. As a bonus the build time will significantly decrease. Also, ensure not to copy all files recursively rather explicitly choose what should be copied to Docker&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise&lt;/strong&gt;: Common personal secret files like &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.aws&lt;/code&gt; and &lt;code&gt;.npmrc&lt;/code&gt; will be shared with anybody with access to the image (e.g. Docker repository)&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/docker-ignore.md&quot;&gt;&lt;strong&gt;Read More: Use .dockerignore&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.5. Clean-up dependencies before production&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Although Dev-Dependencies are sometimes needed during the build and test life-cycle, eventually the image that is shipped to production should be minimal and clean from development dependencies. Doing so guarantees that only necessary code is shipped and the amount of potential attacks (i.e. attack surface) is minimized. When using multi-stage build (see dedicated bullet) this can be achieved by installing all dependencies first and finally running &lt;code&gt;npm ci --production&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Many of the infamous npm security breaches were found within development packages (e.g. &lt;a href=&quot;https://eslint.org/blog/2018/07/postmortem-for-malicious-package-publishes&quot;&gt;eslint-scope&lt;/a&gt;)&lt;/p&gt; 
&lt;p&gt;🔗 Read More: &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/install-for-production.md&quot;&gt;Remove development dependencies&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.6. Shutdown smartly and gracefully&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Handle the process SIGTERM event and clean-up all existing connection and resources. This should be done while responding to ongoing requests. In Dockerized runtimes, shutting down containers is not a rare event, rather a frequent occurrence that happen as part of routine work. Achieving this demands some thoughtful code to orchestrate several moving parts: The load balancer, keep-alive connections, the HTTP server and other resources&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Dying immediately means not responding to thousands of disappointed users&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/graceful-shutdown.md&quot;&gt;&lt;strong&gt;Read More: Graceful shutdown&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.7. Set memory limits using both Docker and v8&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Always configure a memory limit using both Docker and the JavaScript runtime flags. The Docker limit is needed to make thoughtful container placement decision, the --v8&#39;s flag max-old-space is needed to kick off the GC on time and prevent under utilization of memory. Practically, set the v8&#39;s old space memory to be a just bit less than the container limit&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; The docker definition is needed to perform thoughtful scaling decision and prevent starving other citizens. Without also defining the v8&#39;s limits, it will under utilize the container resources - Without explicit instructions it crashes when utilizing ~50-60% of its host resources&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/memory-limit.md&quot;&gt;&lt;strong&gt;Read More: Set memory limits using Docker only&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.8. Plan for efficient caching&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Rebuilding a whole docker image from cache can be nearly instantaneous if done correctly. The less updated instructions should be at the top of your Dockerfile and the ones constantly changing (like app code) should be at the bottom.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Docker build will be very long and consume lot of resources even when making tiny changes&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/use-cache-for-shorter-build-time.md&quot;&gt;&lt;strong&gt;Read More: Leverage caching to reduce build times&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.9. Use explicit image reference, avoid &lt;code&gt;latest&lt;/code&gt; tag&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Specify an explicit image digest or versioned label, never refer to &lt;code&gt;latest&lt;/code&gt;. Developers are often led to believe that specifying the &lt;code&gt;latest&lt;/code&gt; tag will provide them with the most recent image in the repository however this is not the case. Using a digest guarantees that every instance of the service is running exactly the same code.&lt;/p&gt; 
&lt;p&gt;In addition, referring to an image tag means that the base image is subject to change, as image tags cannot be relied upon for a deterministic install. Instead, if a deterministic install is expected, a SHA256 digest can be used to reference an exact image.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; A new version of a base image could be deployed into production with breaking changes, causing unintended application behaviour.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/image-tags.md&quot;&gt;&lt;strong&gt;Read More: Understand image tags and use the &quot;latest&quot; tag with caution&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.10. Prefer smaller Docker base images&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Large images lead to higher exposure to vulnerabilities and increased resource consumption. Using leaner Docker images, such as Slim and Alpine Linux variants, mitigates this issue.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Building, pushing, and pulling images will take longer, unknown attack vectors can be used by malicious actors and more resources are consumed.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/smaller_base_images.md&quot;&gt;&lt;strong&gt;Read More: Prefer smaller images&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.11. Clean-out build-time secrets, avoid secrets in args&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Avoid secrets leaking from the Docker build environment. A Docker image is typically shared in multiple environment like CI and a registry that are not as sanitized as production. A typical example is an npm token which is usually passed to a dockerfile as argument. This token stays within the image long after it is needed and allows the attacker indefinite access to a private npm registry. This can be avoided by coping a secret file like &lt;code&gt;.npmrc&lt;/code&gt; and then removing it using multi-stage build (beware, build history should be deleted as well) or by using Docker build-kit secret feature which leaves zero traces&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Everyone with access to the CI and docker registry will also get access to some precious organization secrets as a bonus&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/avoid-build-time-secrets.md&quot;&gt;&lt;strong&gt;Read More: Clean-out build-time secrets&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.12. Scan images for multi layers of vulnerabilities&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Besides checking code dependencies vulnerabilities also scan the final image that is shipped to production. Docker image scanners check the code dependencies but also the OS binaries. This E2E security scan covers more ground and verifies that no bad guy injected bad things during the build. Consequently, it is recommended running this as the last step before deployment. There are a handful of free and commercial scanners that also provide CI/CD plugins&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Your code might be entirely free from vulnerabilities. However it might still get hacked due to vulnerable version of OS-level binaries (e.g. OpenSSL, TarBall) that are commonly being used by applications&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/scan-images.md&quot;&gt;&lt;strong&gt;Read More: Scan the entire image before production&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.13 Clean NODE_MODULE cache&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; After installing dependencies in a container remove the local cache. It doesn&#39;t make any sense to duplicate the dependencies for faster future installs since there won&#39;t be any further installs - A Docker image is immutable. Using a single line of code tens of MB (typically 10-50% of the image size) are shaved off&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; The image that will get shipped to production will weigh 30% more due to files that will never get used&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/clean-cache.md&quot;&gt;&lt;strong&gt;Read More: Clean NODE_MODULE cache&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.14. Generic Docker practices&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; This is a collection of Docker advice that is not related directly to Node.js - the Node implementation is not much different than any other language. Click read more to skim through.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/generic-tips.md&quot;&gt;&lt;strong&gt;Read More: Generic Docker practices&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/checkbox-small-blue.png&quot; alt=&quot;✔&quot; /&gt; 8.15. Lint your Dockerfile&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;🌟 #new&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Linting your Dockerfile is an important step to identify issues in your Dockerfile which differ from best practices. By checking for potential flaws using a specialised Docker linter, performance and security improvements can be easily identified, saving countless hours of wasted time or security issues in production code.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Otherwise:&lt;/strong&gt; Mistakenly the Dockerfile creator left Root as the production user, and also used an image from unknown source repository. This could be avoided with with just a simple linter.&lt;/p&gt; 
&lt;p&gt;🔗 &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/sections/docker/lint-dockerfile.md&quot;&gt;&lt;strong&gt;Read More: Lint your Dockerfile&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#table-of-contents&quot;&gt;⬆ Return to top&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;Milestones&lt;/h1&gt; 
&lt;p&gt;To maintain this guide and keep it up to date, we are constantly updating and improving the guidelines and best practices with the help of the community. You can follow our &lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/milestones&quot;&gt;milestones&lt;/a&gt; and join the working groups if you want to contribute to this project&lt;/p&gt; 
&lt;br /&gt; 
&lt;h2&gt;Translations&lt;/h2&gt; 
&lt;p&gt;All translations are contributed by the community. We will be happy to get any help with either completed, ongoing or new translations!&lt;/p&gt; 
&lt;h3&gt;Completed translations&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/BR.png&quot; alt=&quot;BR&quot; /&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.brazilian-portuguese.md&quot;&gt;Brazilian Portuguese&lt;/a&gt; - Courtesy of &lt;a href=&quot;https://github.com/marcelosdm&quot;&gt;Marcelo Melo&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/CN.png&quot; alt=&quot;CN&quot; /&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.chinese.md&quot;&gt;Chinese&lt;/a&gt; - Courtesy of &lt;a href=&quot;https://github.com/mattjin&quot;&gt;Matt Jin&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/RU.png&quot; alt=&quot;RU&quot; /&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.russian.md&quot;&gt;Russian&lt;/a&gt; - Courtesy of &lt;a href=&quot;https://github.com/contributorpw&quot;&gt;Alex Ivanov&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/PL.png&quot; alt=&quot;PL&quot; /&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.polish.md&quot;&gt;Polish&lt;/a&gt; - Courtesy of &lt;a href=&quot;https://github.com/mbiesiad&quot;&gt;Michal Biesiada&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/JA.png&quot; alt=&quot;JA&quot; /&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.japanese.md&quot;&gt;Japanese&lt;/a&gt; - Courtesy of &lt;a href=&quot;https://github.com/YukiOta&quot;&gt;Yuki Ota&lt;/a&gt;, &lt;a href=&quot;https://github.com/YA21&quot;&gt;Yuta Azumi&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/EU.png&quot; alt=&quot;EU&quot; /&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.basque.md&quot;&gt;Basque&lt;/a&gt; - Courtesy of &lt;a href=&quot;https://github.com/anediaz&quot;&gt;Ane Diaz de Tuesta&lt;/a&gt; &amp;amp; Joxefe Diaz de Tuesta&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Translations in progress&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/FR.png&quot; alt=&quot;FR&quot; /&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.french.md&quot;&gt;French&lt;/a&gt; (&lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/issues/129&quot;&gt;Discussion&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/HE.png&quot; alt=&quot;HE&quot; /&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.hebrew.md&quot;&gt;Hebrew&lt;/a&gt; (&lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/issues/156&quot;&gt;Discussion&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/KR.png&quot; alt=&quot;KR&quot; /&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/README.korean.md&quot;&gt;Korean&lt;/a&gt; - Courtesy of &lt;a href=&quot;https://github.com/uronly14me&quot;&gt;Sangbeom Han&lt;/a&gt; (&lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/issues/94&quot;&gt;Discussion&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/ES.png&quot; alt=&quot;ES&quot; /&gt; &lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/raw/spanish-translation/README.spanish.md&quot;&gt;Spanish&lt;/a&gt; (&lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/issues/95&quot;&gt;Discussion&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/flags/TR.png&quot; alt=&quot;TR&quot; /&gt; Turkish (&lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/issues/139&quot;&gt;Discussion&lt;/a&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Steering Committee&lt;/h2&gt; 
&lt;p&gt;Meet the steering committee members - the people who work together to provide guidance and future direction to the project. In addition, each member of the committee leads a project tracked under our &lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/projects&quot;&gt;GitHub projects&lt;/a&gt;.&lt;/p&gt; 
&lt;img align=&quot;left&quot; width=&quot;100&quot; height=&quot;100&quot; src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/members/yoni.png&quot; /&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/goldbergyoni&quot;&gt;Yoni Goldberg&lt;/a&gt; &lt;a href=&quot;https://twitter.com/goldbergyoni&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/twitter.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://goldbergyoni.com&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/web.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Independent Node.js consultant who works with customers in the USA, Europe, and Israel on building large-scale Node.js applications. Many of the best practices above were first published at &lt;a href=&quot;https://goldbergyoni.com&quot;&gt;goldbergyoni.com&lt;/a&gt;. Reach Yoni at &lt;a href=&quot;https://github.com/goldbergyoni&quot;&gt;@goldbergyoni&lt;/a&gt; or &lt;a href=&quot;mailto:me@goldbergyoni.com&quot;&gt;me@goldbergyoni.com&lt;/a&gt;&lt;/p&gt; 
&lt;br /&gt; 
&lt;p&gt;&lt;a id=&quot;josh-hemphill&quot; href=&quot;https://github.com/josh-hemphill&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/members/josh-hemphill.png&quot; align=&quot;left&quot; width=&quot;100&quot; height=&quot;100&quot; alt=&quot;Josh Hemphill&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/josh-hemphill&quot;&gt;Josh Hemphill&lt;/a&gt; &lt;a href=&quot;https://twitter.com/spooklogical&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/twitter.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.linkedin.com/in/joshuahemphill/&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/linkedin.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://joshuahemphill.com&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/web.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Full Stack Software Engineer / Developer specializing in Security, DevOps/DevSecOps, and ERP Integrations.&lt;/p&gt; 
&lt;br /&gt; 
&lt;p&gt;&lt;a id=&quot;raz-luvaton&quot; href=&quot;https://github.com/rluvaton&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/members/raz-luvaton.jpg&quot; align=&quot;left&quot; width=&quot;100&quot; height=&quot;100&quot; alt=&quot;Raz Luvaton&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/rluvaton&quot;&gt;Raz Luvaton&lt;/a&gt; &lt;a href=&quot;https://twitter.com/rluvaton&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/twitter.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.linkedin.com/in/rluvaton/&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/linkedin.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Full Stack Developer who knows how to exit from Vim and loves Architecture, Virtualization and Security.&lt;/p&gt; 
&lt;br /&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;If you&#39;ve ever wanted to contribute to open source, now is your chance! See the &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/.operations/CONTRIBUTING.md&quot;&gt;contributing docs&lt;/a&gt; for more information.&lt;/p&gt; 
&lt;h2&gt;Contributors ✨&lt;/h2&gt; 
&lt;p&gt;Thanks goes to these wonderful people who have contributed to this repository!&lt;/p&gt; 
&lt;!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --&gt; 
&lt;!-- prettier-ignore-start --&gt; 
&lt;!-- markdownlint-disable --&gt; 
&lt;table&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/kevinrambaud&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/7501477?v=4&quot; width=&quot;100px;&quot; alt=&quot;Kevin Rambaud&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Kevin Rambaud&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-kevinrambaud&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/mfine15&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1286554?v=4&quot; width=&quot;100px;&quot; alt=&quot;Michael Fine&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Michael Fine&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-mfine15&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://squgeim.github.io&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/4996818?v=4&quot; width=&quot;100px;&quot; alt=&quot;Shreya Dahal&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Shreya Dahal&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-squgeim&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://matheusrocha89.com&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/3718366?v=4&quot; width=&quot;100px;&quot; alt=&quot;Matheus Cruz Rocha&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Matheus Cruz Rocha&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-matheusrocha89&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://bityog.github.io/Portfolio/&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/28219178?v=4&quot; width=&quot;100px;&quot; alt=&quot;Yog Mehta&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Yog Mehta&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-BitYog&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://kudapara.co.zw&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/13519184?v=4&quot; width=&quot;100px;&quot; alt=&quot;Kudakwashe Paradzayi&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Kudakwashe Paradzayi&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-kudapara&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.t1st3.com/&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1469638?v=4&quot; width=&quot;100px;&quot; alt=&quot;t1st3&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;t1st3&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-t1st3&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/mulijordan1976&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/33382022?v=4&quot; width=&quot;100px;&quot; alt=&quot;mulijordan1976&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;mulijordan1976&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-mulijordan1976&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://twitter.com/matchai&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/4658208?v=4&quot; width=&quot;100px;&quot; alt=&quot;Matan Kushner&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Matan Kushner&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-matchai&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://fabiothiroki.github.io&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/670057?v=4&quot; width=&quot;100px;&quot; alt=&quot;Fabio Hiroki&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Fabio Hiroki&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-fabiothiroki&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://james.sumners.info/&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/321201?v=4&quot; width=&quot;100px;&quot; alt=&quot;James Sumners&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;James Sumners&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-jsumners&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://twitter.com/_DanGamble&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7152041?v=4&quot; width=&quot;100px;&quot; alt=&quot;Dan Gamble&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Dan Gamble&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-dan-gamble&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/trainorpj&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/13276704?v=4&quot; width=&quot;100px;&quot; alt=&quot;PJ Trainor&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;PJ Trainor&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-trainorpj&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/reod&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3164299?v=4&quot; width=&quot;100px;&quot; alt=&quot;Remek Ambroziak&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Remek Ambroziak&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-reod&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://ca.non.co.il&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1829789?v=4&quot; width=&quot;100px;&quot; alt=&quot;Yoni Jah&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Yoni Jah&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-yonjah&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/hazolsky&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1270790?v=4&quot; width=&quot;100px;&quot; alt=&quot;Misha Khokhlov&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Misha Khokhlov&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-hazolsky&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://plus.google.com/+%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D0%B9%D0%9E%D1%80%D0%B5%D1%85%D0%BE%D0%B2/&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/8045060?v=4&quot; width=&quot;100px;&quot; alt=&quot;Evgeny Orekhov&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Evgeny Orekhov&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-EvgenyOrekhov&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/gediminasml&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/19854105?v=4&quot; width=&quot;100px;&quot; alt=&quot;-&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;-&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-gediminasml&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://hisaac.net&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/923876?v=4&quot; width=&quot;100px;&quot; alt=&quot;Isaac Halvorson&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Isaac Halvorson&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-hisaac&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://www.vedrankaracic.com&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/2808092?v=4&quot; width=&quot;100px;&quot; alt=&quot;Vedran Karačić&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Vedran Karačić&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-vkaracic&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/lallenlowe&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10761165?v=4&quot; width=&quot;100px;&quot; alt=&quot;lallenlowe&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;lallenlowe&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-lallenlowe&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/nwwells&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1039473?v=4&quot; width=&quot;100px;&quot; alt=&quot;Nathan Wells&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Nathan Wells&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-nwwells&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/paulovitin&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/125503?v=4&quot; width=&quot;100px;&quot; alt=&quot;Paulo Reis&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Paulo Reis&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-paulovitin&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://snap.simpego.ch&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1989646?v=4&quot; width=&quot;100px;&quot; alt=&quot;syzer&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;syzer&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-syzer&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://sancho.dev&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3763599?v=4&quot; width=&quot;100px;&quot; alt=&quot;David Sancho&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;David Sancho&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-davesnx&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://apiforge.it&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/4929965?v=4&quot; width=&quot;100px;&quot; alt=&quot;Robert Manolea&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Robert Manolea&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-pupix&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://jumptoglide.com&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/708395?v=4&quot; width=&quot;100px;&quot; alt=&quot;Xavier Ho&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Xavier Ho&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-spaxe&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://www.ocular-rhythm.io&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/2738518?v=4&quot; width=&quot;100px;&quot; alt=&quot;Aaron&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Aaron&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ocularrhythm&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://septa97.me&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/13742634?v=4&quot; width=&quot;100px;&quot; alt=&quot;Jan Charles Maghirang Adona&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Jan Charles Maghirang Adona&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-septa97&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.cakeresume.com/allenfang&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/5351390?v=4&quot; width=&quot;100px;&quot; alt=&quot;Allen&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Allen&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-AllenFang&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/leonardovillela&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/8650543?v=4&quot; width=&quot;100px;&quot; alt=&quot;Leonardo Villela&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Leonardo Villela&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-leonardovillela&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://michalzalecki.com&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/3136577?v=4&quot; width=&quot;100px;&quot; alt=&quot;Michał Załęcki&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Michał Załęcki&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-MichalZalecki&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://www.wealthbar.com&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/156449?v=4&quot; width=&quot;100px;&quot; alt=&quot;Chris Nicola&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Chris Nicola&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-chrisnicola&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://twitter.com/aecorredor&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/9114987?v=4&quot; width=&quot;100px;&quot; alt=&quot;Alejandro Corredor&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Alejandro Corredor&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-aecorredor&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/cwar&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/272843?v=4&quot; width=&quot;100px;&quot; alt=&quot;cwar&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;cwar&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-cwar&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/keyfoxth&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10647132?v=4&quot; width=&quot;100px;&quot; alt=&quot;Yuwei&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Yuwei&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-keyfoxth&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://bigcodenerd.org&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10895594?v=4&quot; width=&quot;100px;&quot; alt=&quot;Utkarsh Bhatt&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Utkarsh Bhatt&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-utkarshbhatt12&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/duartemendes&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/12852058?v=4&quot; width=&quot;100px;&quot; alt=&quot;Duarte Mendes&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Duarte Mendes&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-duartemendes&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://jasonkim.ca&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/103456?v=4&quot; width=&quot;100px;&quot; alt=&quot;Jason Kim&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Jason Kim&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-serv&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/Max101&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/2124249?v=4&quot; width=&quot;100px;&quot; alt=&quot;Mitja O.&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Mitja O.&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Max101&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://sandromiguel.com&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6423157?v=4&quot; width=&quot;100px;&quot; alt=&quot;Sandro Miguel Marques&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Sandro Miguel Marques&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-SandroMiguel&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/GabeKuslansky&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/9855482?v=4&quot; width=&quot;100px;&quot; alt=&quot;Gabe&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Gabe&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-GabeKuslansky&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://ripper234.com/&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/172282?v=4&quot; width=&quot;100px;&quot; alt=&quot;Ron Gross&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Ron Gross&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ripper234&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://www.thecodebarbarian.com&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1620265?v=4&quot; width=&quot;100px;&quot; alt=&quot;Valeri Karpov&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Valeri Karpov&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-vkarpov15&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://sergiobernal.com&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/20087388?v=4&quot; width=&quot;100px;&quot; alt=&quot;Sergio Bernal&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Sergio Bernal&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-imsergiobernal&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/ntelkedzhiev&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/7332371?v=4&quot; width=&quot;100px;&quot; alt=&quot;Nikola Telkedzhiev&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Nikola Telkedzhiev&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ntelkedzhiev&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/vitordagamagodoy&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/26370059?v=4&quot; width=&quot;100px;&quot; alt=&quot;Vitor Godoy&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Vitor Godoy&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-vitordagamagodoy&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.manishsaraan.com/&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/19797340?v=4&quot; width=&quot;100px;&quot; alt=&quot;Manish Saraan&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Manish Saraan&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-manishsaraan&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/uronly14me&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/5186814?v=4&quot; width=&quot;100px;&quot; alt=&quot;Sangbeom Han&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Sangbeom Han&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-uronly14me&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://blackmatch.github.io&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/12443954?v=4&quot; width=&quot;100px;&quot; alt=&quot;blackmatch&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;blackmatch&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-blackmatch&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://simmsreeve.com&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/5173131?v=4&quot; width=&quot;100px;&quot; alt=&quot;Joe Reeve&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Joe Reeve&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ISNIT0&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/BusbyActual&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/14985016?v=4&quot; width=&quot;100px;&quot; alt=&quot;Ryan Busby&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Ryan Busby&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-BusbyActual&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://jsdecorator.com&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/4482199?v=4&quot; width=&quot;100px;&quot; alt=&quot;Iman Mohamadi&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Iman Mohamadi&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ImanMh&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/HeeL&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/287769?v=4&quot; width=&quot;100px;&quot; alt=&quot;Sergii Paryzhskyi&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Sergii Paryzhskyi&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-HeeL&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/kapilepatel&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/25738473?v=4&quot; width=&quot;100px;&quot; alt=&quot;Kapil Patel&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Kapil Patel&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-kapilepatel&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://twitter.com/justjavac&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/359395?v=4&quot; width=&quot;100px;&quot; alt=&quot;迷渡&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;迷渡&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-justjavac&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/hozefaj&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/2084833?v=4&quot; width=&quot;100px;&quot; alt=&quot;Hozefa&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Hozefa&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-hozefaj&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/el-ethan&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/10249884?v=4&quot; width=&quot;100px;&quot; alt=&quot;Ethan&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Ethan&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-el-ethan&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/milkdeliver&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/3108407?v=4&quot; width=&quot;100px;&quot; alt=&quot;Sam&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Sam&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-milkdeliver&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/ArlindXh&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/19508764?v=4&quot; width=&quot;100px;&quot; alt=&quot;Arlind&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Arlind&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ArlindXh&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/ttous&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/19815440?v=4&quot; width=&quot;100px;&quot; alt=&quot;Teddy Toussaint&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Teddy Toussaint&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ttous&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://ardern.io&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/2419690?v=4&quot; width=&quot;100px;&quot; alt=&quot;Lewis&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Lewis&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-LewisArdern&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://gabriellidenor.com/&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/765963?v=4&quot; width=&quot;100px;&quot; alt=&quot;Gabriel Lidenor &quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Gabriel Lidenor &lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-GabrielLidenor&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/animir&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/4623196?v=4&quot; width=&quot;100px;&quot; alt=&quot;Roman&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Roman&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-animir&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/Francozeira&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/47419763?v=4&quot; width=&quot;100px;&quot; alt=&quot;Francozeira&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Francozeira&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Francozeira&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://twitter.com/invvard&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/7305493?v=4&quot; width=&quot;100px;&quot; alt=&quot;Invvard&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Invvard&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Invvard&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://romulogarofalo.github.io/&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/18492592?v=4&quot; width=&quot;100px;&quot; alt=&quot;Rômulo Garofalo&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Rômulo Garofalo&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-romulogarofalo&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://thoqbk.github.io/&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1491103?v=4&quot; width=&quot;100px;&quot; alt=&quot;Tho Q Luong&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Tho Q Luong&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-thoqbk&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/Qeneke&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/20271568?v=4&quot; width=&quot;100px;&quot; alt=&quot;Burak Shen&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Burak Shen&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Qeneke&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://www.happy-css.com&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/2950505?v=4&quot; width=&quot;100px;&quot; alt=&quot;Martin Muzatko&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Martin Muzatko&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-MartinMuzatko&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/autoboxer&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/2757601?v=4&quot; width=&quot;100px;&quot; alt=&quot;Jared Collier&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Jared Collier&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-autoboxer&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://hiltonmeyer.com&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/4545860?v=4&quot; width=&quot;100px;&quot; alt=&quot;Hilton Meyer&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Hilton Meyer&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-bikingbadger&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://kr.vuejs.org&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1451365?v=4&quot; width=&quot;100px;&quot; alt=&quot;ChangJoo Park(박창주)&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;ChangJoo Park(박창주)&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ChangJoo-Park&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/MasahiroSakaguchi&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/16427431?v=4&quot; width=&quot;100px;&quot; alt=&quot;Masahiro Sakaguchi&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Masahiro Sakaguchi&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-MasahiroSakaguchi&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/TheHollidayInn&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/1253400?v=4&quot; width=&quot;100px;&quot; alt=&quot;Keith Holliday&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Keith Holliday&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-TheHollidayInn&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.coreycleary.me&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1485356?v=4&quot; width=&quot;100px;&quot; alt=&quot;coreyc&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;coreyc&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-coreyc&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://maxcubing.wordpress.com&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/8260834?v=4&quot; width=&quot;100px;&quot; alt=&quot;Maximilian Berkmann&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Maximilian Berkmann&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Berkmann18&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/DouglasMV&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/32845487?v=4&quot; width=&quot;100px;&quot; alt=&quot;Douglas Mariano Valero&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Douglas Mariano Valero&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-DouglasMV&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/marcelosdm&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/18266600?v=4&quot; width=&quot;100px;&quot; alt=&quot;Marcelo Melo&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Marcelo Melo&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-marcelosdm&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://twitter.com/mperk_&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/3465794?v=4&quot; width=&quot;100px;&quot; alt=&quot;Mehmet Perk&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Mehmet Perk&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-mperk&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/ryanouyang&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/360426?v=4&quot; width=&quot;100px;&quot; alt=&quot;ryan ouyang&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;ryan ouyang&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ryanouyang&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/shabeer-mdy&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/26842535?v=4&quot; width=&quot;100px;&quot; alt=&quot;Shabeer&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Shabeer&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-shabeer-mdy&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/halfzebra&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/3983879?v=4&quot; width=&quot;100px;&quot; alt=&quot;Eduard Kyvenko&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Eduard Kyvenko&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-halfzebra&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://deyvisonrocha.com&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/686067?v=4&quot; width=&quot;100px;&quot; alt=&quot;Deyvison Rocha&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Deyvison Rocha&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-deyvisonrocha&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://twitter.com/georgemamer&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/20108934?v=4&quot; width=&quot;100px;&quot; alt=&quot;George Mamer&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;George Mamer&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-georgem3&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/leimonio&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1969742?v=4&quot; width=&quot;100px;&quot; alt=&quot;Konstantinos Leimonis&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Konstantinos Leimonis&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-leimonio&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/Zybax&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/22094453?v=4&quot; width=&quot;100px;&quot; alt=&quot;Oliver Lluberes&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Oliver Lluberes&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-Zybax&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/story/tiendq&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/815910?v=4&quot; width=&quot;100px;&quot; alt=&quot;Tien Do&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Tien Do&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-tiendq&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://singh1114.github.io/&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/11356398?v=4&quot; width=&quot;100px;&quot; alt=&quot;Ranvir Singh&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Ranvir Singh&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-singh1114&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/collierrgbsitisfise&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/13496126?v=4&quot; width=&quot;100px;&quot; alt=&quot;Vadim Nicolaev&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Vadim Nicolaev&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-collierrgbsitisfise&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-collierrgbsitisfise&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/germangamboa95&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/28633849?v=4&quot; width=&quot;100px;&quot; alt=&quot;German Gamboa Gonzalez&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;German Gamboa Gonzalez&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-germangamboa95&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/AbdelrahmanHafez&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/19984935?v=4&quot; width=&quot;100px;&quot; alt=&quot;Hafez&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Hafez&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-AbdelrahmanHafez&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://linkedin.com/in/chandiran-dmc&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/42678579?v=4&quot; width=&quot;100px;&quot; alt=&quot;Chandiran&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Chandiran&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-chandiran-dmc&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/VinayaSathyanarayana&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/16976677?v=4&quot; width=&quot;100px;&quot; alt=&quot;VinayaSathyanarayana&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;VinayaSathyanarayana&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-VinayaSathyanarayana&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.kimkern.de&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/2671139?v=4&quot; width=&quot;100px;&quot; alt=&quot;Kim Kern&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Kim Kern&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-kiwikern&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://kennethfreitas.github.io/&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/55669043?v=4&quot; width=&quot;100px;&quot; alt=&quot;Kenneth Freitas&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Kenneth Freitas&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-kennethfreitas&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/songe&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1531561?v=4&quot; width=&quot;100px;&quot; alt=&quot;songe&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;songe&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-songe&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://ksed.dev&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/30693707?v=4&quot; width=&quot;100px;&quot; alt=&quot;Kirill Shekhovtsov&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Kirill Shekhovtsov&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Ksedline&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/SerzN1&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/2534649?v=4&quot; width=&quot;100px;&quot; alt=&quot;Serge&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Serge&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-SerzN1&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/keyrwinz&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/21241761?v=4&quot; width=&quot;100px;&quot; alt=&quot;keyrwinz&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;keyrwinz&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-keyrwinz&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/nDmitry&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/2134568?v=4&quot; width=&quot;100px;&quot; alt=&quot;Dmitry Nikitenko&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Dmitry Nikitenko&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-nDmitry&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://bushuai.cc&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1875256?v=4&quot; width=&quot;100px;&quot; alt=&quot;bushuai&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;bushuai&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/pulls?q=is%3Apr+reviewed-by%3Abushuai&quot; title=&quot;Reviewed Pull Requests&quot;&gt;👀&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-bushuai&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/1348195/benjamin-gruenbaum&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/1315533?v=4&quot; width=&quot;100px;&quot; alt=&quot;Benjamin Gruenbaum&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Benjamin Gruenbaum&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-benjamingr&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/byeze&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/7424138?v=4&quot; width=&quot;100px;&quot; alt=&quot;Ezequiel&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Ezequiel&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-byeze&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/juaoose&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/994594?v=4&quot; width=&quot;100px;&quot; alt=&quot;Juan José Rodríguez&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Juan José Rodríguez&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-juaoose&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/OrBin&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/6897234?v=4&quot; width=&quot;100px;&quot; alt=&quot;Or Bin&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Or Bin&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-OrBin&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://twitter.com/andreoav07&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/508827?v=4&quot; width=&quot;100px;&quot; alt=&quot;Andreo Vieira&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Andreo Vieira&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-andreoav&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/mikicho&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/11459632?v=4&quot; width=&quot;100px;&quot; alt=&quot;Michael Solomon&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Michael Solomon&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-mikicho&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/jimmycallin&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/2225828?v=4&quot; width=&quot;100px;&quot; alt=&quot;Jimmy Callin&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Jimmy Callin&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-jimmycallin&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/siddharthofficial/&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/26025955?v=4&quot; width=&quot;100px;&quot; alt=&quot;Siddharth&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Siddharth&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-w01fS&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://ryansmith.tech/&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/1578766?v=4&quot; width=&quot;100px;&quot; alt=&quot;Ryan Smith&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Ryan Smith&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ryan3E0&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://de.linkedin.com/in/tom-boettger&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/49961674?v=4&quot; width=&quot;100px;&quot; alt=&quot;Tom Boettger&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Tom Boettger&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-bttger&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/jormaechea&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/5612500?v=4&quot; width=&quot;100px;&quot; alt=&quot;Joaquín Ormaechea&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Joaquín Ormaechea&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-jormaechea&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/dfrzuz&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/71859096?v=4&quot; width=&quot;100px;&quot; alt=&quot;dfrzuz&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;dfrzuz&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-dfrzuz&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/victor-homyakov&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/121449?v=4&quot; width=&quot;100px;&quot; alt=&quot;Victor Homyakov&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Victor Homyakov&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-victor-homyakov&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://joshuahemphill.com&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/46608115?v=4&quot; width=&quot;100px;&quot; alt=&quot;Josh&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Josh&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-josh-hemphill&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#security-josh-hemphill&quot; title=&quot;Security&quot;&gt;🛡️&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/alec-francis&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/32949882?v=4&quot; width=&quot;100px;&quot; alt=&quot;Alec Francis&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Alec Francis&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-alec-francis&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/arjun6610&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/61268891?v=4&quot; width=&quot;100px;&quot; alt=&quot;arjun6610&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;arjun6610&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-arjun6610&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/jan-osch&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/11651780?v=4&quot; width=&quot;100px;&quot; alt=&quot;Jan Osch&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Jan Osch&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-jan-osch&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/thiagotrs&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/32005779?v=4&quot; width=&quot;100px;&quot; alt=&quot;Thiago Rotondo Sampaio&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Thiago Rotondo Sampaio&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-thiagotrs&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/Alexsey&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/6392013?v=4&quot; width=&quot;100px;&quot; alt=&quot;Alexsey&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Alexsey&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Alexsey&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/13luismb&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/32210483?v=4&quot; width=&quot;100px;&quot; alt=&quot;Luis A. Acurero&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Luis A. Acurero&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-13luismb&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://lromano97.github.io/&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/22394847?v=4&quot; width=&quot;100px;&quot; alt=&quot;Lucas Romano&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Lucas Romano&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-lromano97&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/denisecase&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/13016516?v=4&quot; width=&quot;100px;&quot; alt=&quot;Denise Case&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Denise Case&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-denisecase&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://stackoverflow.com/story/elektronik&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/1078554?v=4&quot; width=&quot;100px;&quot; alt=&quot;Nick Ribal&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Nick Ribal&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-elektronik2k5&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt; &lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/pulls?q=is%3Apr+reviewed-by%3Aelektronik2k5&quot; title=&quot;Reviewed Pull Requests&quot;&gt;👀&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/0xflotus&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/26602940?v=4&quot; width=&quot;100px;&quot; alt=&quot;0xflotus&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;0xflotus&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-0xflotus&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.dijonkitchen.org/&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/11434205?v=4&quot; width=&quot;100px;&quot; alt=&quot;Jonathan Chen&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Jonathan Chen&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-dijonkitchen&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/dilansri&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/5089728?v=4&quot; width=&quot;100px;&quot; alt=&quot;Dilan Srilal&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Dilan Srilal&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-dilansri&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://vectree.ru&quot;&gt;&lt;img src=&quot;https://avatars3.githubusercontent.com/u/4215285?v=4&quot; width=&quot;100px;&quot; alt=&quot;vladthelittleone&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;vladthelittleone&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-vladthelittleone&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.nikolaso.com&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/60047271?v=4&quot; width=&quot;100px;&quot; alt=&quot;Nik Osvalds&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Nik Osvalds&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-nosvalds&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/kdaniel21&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/39854385?v=4&quot; width=&quot;100px;&quot; alt=&quot;Daniel Kiss&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Daniel Kiss&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/commits?author=kdaniel21&quot; title=&quot;Documentation&quot;&gt;📖&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://twitter.com/forresst17&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/163352?v=4&quot; width=&quot;100px;&quot; alt=&quot;Forresst&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Forresst&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-forresst&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/svenheden&quot;&gt;&lt;img src=&quot;https://avatars1.githubusercontent.com/u/76098?v=4&quot; width=&quot;100px;&quot; alt=&quot;Jonathan Svenheden&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Jonathan Svenheden&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-svenheden&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/AustrisC&quot;&gt;&lt;img src=&quot;https://avatars2.githubusercontent.com/u/12381652?v=4&quot; width=&quot;100px;&quot; alt=&quot;AustrisC&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;AustrisC&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-AustrisC&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/cisco0808&quot;&gt;&lt;img src=&quot;https://avatars0.githubusercontent.com/u/60251188?v=4&quot; width=&quot;100px;&quot; alt=&quot;kyeongtae kim&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;kyeongtae kim&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-cisco0808&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://keybase.io/651z9pz968v2accj&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/65741741?v=4&quot; width=&quot;100px;&quot; alt=&quot;007&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;007&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-6gx7iycn53ioq2e8apk1j1ypwov4giui&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://www.anediaz.com&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/17216937?v=4&quot; width=&quot;100px;&quot; alt=&quot;Ane Diaz de Tuesta&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Ane Diaz de Tuesta&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-anediaz&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-anediaz&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://yukioh.net&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/23182489?v=4&quot; width=&quot;100px;&quot; alt=&quot;YukiOta&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;YukiOta&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-YukiOta&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.yeovilhospital.co.uk/&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/43814140?v=4&quot; width=&quot;100px;&quot; alt=&quot;Frazer Smith&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Frazer Smith&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Fdawgs&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/rluvaton&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/16746759?v=4&quot; width=&quot;100px;&quot; alt=&quot;Raz Luvaton&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Raz Luvaton&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-rluvaton&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/YA21&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/37298463?v=4&quot; width=&quot;100px;&quot; alt=&quot;Yuta Azumi&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Yuta Azumi&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-YA21&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/andrewjbarbour&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/77080074?v=4&quot; width=&quot;100px;&quot; alt=&quot;andrewjbarbour&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;andrewjbarbour&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-andrewjbarbour&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://MasujimaRyohei.jp&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/17163541?v=4&quot; width=&quot;100px;&quot; alt=&quot;mr&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;mr&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-MasujimaRyohei&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/kubanac95&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/16191931?v=4&quot; width=&quot;100px;&quot; alt=&quot;Aleksandar&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Aleksandar&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-kubanac95&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://vincentjonathan.com&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/32597776?v=4&quot; width=&quot;100px;&quot; alt=&quot;Owl&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Owl&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-SuspiciousLookingOwl&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/yedidyas&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/36074789?v=4&quot; width=&quot;100px;&quot; alt=&quot;Yedidya Schwartz&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Yedidya Schwartz&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-yedidyas&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#example-yedidyas&quot; title=&quot;Examples&quot;&gt;💡&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/ariel-diaz&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/20423540?v=4&quot; width=&quot;100px;&quot; alt=&quot;ari&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;ari&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ariel-diaz&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://www.koenigthomas.de/&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/7080389?v=4&quot; width=&quot;100px;&quot; alt=&quot;Thomas König&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Thomas König&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Vispercept&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/coocos&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/1397804?v=4&quot; width=&quot;100px;&quot; alt=&quot;Kalle Lämsä&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Kalle Lämsä&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-coocos&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://math.cat&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/10328430?v=4&quot; width=&quot;100px;&quot; alt=&quot;Wyatt&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Wyatt&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-ZhyMC&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://libkhadir.fr&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/45130488?v=4&quot; width=&quot;100px;&quot; alt=&quot;KHADIR Tayeb&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;KHADIR Tayeb&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-tkhadir&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/shankarregmi&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/7703345?v=4&quot; width=&quot;100px;&quot; alt=&quot;Shankar Regmi&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Shankar Regmi&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-shankarregmi&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/codebyshubham&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/10389723?v=4&quot; width=&quot;100px;&quot; alt=&quot;Shubham&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Shubham&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-codebyshubham&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://lucalves.me/&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/17712401?v=4&quot; width=&quot;100px;&quot; alt=&quot;Lucas Alves&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Lucas Alves&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-lucalves&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/benjaminudoh10&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/9018331?v=4&quot; width=&quot;100px;&quot; alt=&quot;Benjamin&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Benjamin&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-benjaminudoh10&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.yjoer.com&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/47742486?v=4&quot; width=&quot;100px;&quot; alt=&quot;Yeoh Joer&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Yeoh Joer&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-yjoer&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://blog.miigon.net&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/16161991?v=4&quot; width=&quot;100px;&quot; alt=&quot;Miigon&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Miigon&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Miigon&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://brainstorage.me/Egregor2011&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/3630318?v=4&quot; width=&quot;100px;&quot; alt=&quot;Rostislav Bogorad&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Rostislav Bogorad&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Egregor2011&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/Flouse&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/1297478?v=4&quot; width=&quot;100px;&quot; alt=&quot;Flouse&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Flouse&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Flouse&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://taranttini.com&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/6922125?v=4&quot; width=&quot;100px;&quot; alt=&quot;Tarantini Pereira&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Tarantini Pereira&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-taranttini&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/kzmat&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/34614358?v=4&quot; width=&quot;100px;&quot; alt=&quot;Kazuki Matsuo&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Kazuki Matsuo&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-kzmat&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/burkybang&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/927886?v=4&quot; width=&quot;100px;&quot; alt=&quot;Adam Smith&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Adam Smith&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-burkybang&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://codekodo.tistory.com&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/33795856?v=4&quot; width=&quot;100px;&quot; alt=&quot;Dohyeon Ko&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Dohyeon Ko&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-k906506&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/vlad99902&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/67615003?v=4&quot; width=&quot;100px;&quot; alt=&quot;Vladislav Legkov&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Vladislav Legkov&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-vlad99902&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://kerolloz.github.io&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/36763164?v=4&quot; width=&quot;100px;&quot; alt=&quot;Kerollos Magdy&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Kerollos Magdy&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-kerolloz&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/erez-lieberman-b90b7219/&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/3277260?v=4&quot; width=&quot;100px;&quot; alt=&quot;Erez Lieberman&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Erez Lieberman&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-erezLieberman&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/breno-macedo-ernani-de-s%C3%A1-110223158/&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/48841329?v=4&quot; width=&quot;100px;&quot; alt=&quot;Breno Macedo&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Breno Macedo&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-breno404&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/JFernando122&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/40414805?v=4&quot; width=&quot;100px;&quot; alt=&quot;Fernando Flores&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Fernando Flores&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-JFernando122&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/rafaelconcept/&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/43880669?v=4&quot; width=&quot;100px;&quot; alt=&quot;Rafael Brito&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Rafael Brito&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-rafaelconcept&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://emiliano-peralta-portfolio.vercel.app/&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/63617637?v=4&quot; width=&quot;100px;&quot; alt=&quot;Emiliano Peralta&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Emiliano Peralta&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-emiperalta&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://lannex.github.io&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/7369541?v=4&quot; width=&quot;100px;&quot; alt=&quot;Shin, SJ&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Shin, SJ&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-lannex&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;http://www.benjaminforster.com&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/12589522?v=4&quot; width=&quot;100px;&quot; alt=&quot;Benjamin Forster&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Benjamin Forster&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-e-e-e&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/DanieleFedeli&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/37077048?v=4&quot; width=&quot;100px;&quot; alt=&quot;Daniele Fedeli&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Daniele Fedeli&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-DanieleFedeli&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/djob195&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/17146669?v=4&quot; width=&quot;100px;&quot; alt=&quot;djob195&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;djob195&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-djob195&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/antspk&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/78955792?v=4&quot; width=&quot;100px;&quot; alt=&quot;antspk&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;antspk&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-antspk&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://jjy0821.tistory.com/&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/88075341?v=4&quot; width=&quot;100px;&quot; alt=&quot;정진영&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;정진영&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-jjy821&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/kkk-cashwalk&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/91455122?v=4&quot; width=&quot;100px;&quot; alt=&quot;kkk-cashwalk&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;kkk-cashwalk&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-kkk-cashwalk&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/apainintheneck&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/42982186?v=4&quot; width=&quot;100px;&quot; alt=&quot;apainintheneck&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;apainintheneck&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-apainintheneck&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/koyanyaroo&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/9715368?v=4&quot; width=&quot;100px;&quot; alt=&quot;Fajar Budhi Iswanda&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Fajar Budhi Iswanda&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-koyanyaroo&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/jutiger&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/97490806?v=4&quot; width=&quot;100px;&quot; alt=&quot;이주호&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;이주호&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-jutiger&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/MisterSingh&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/44462019?v=4&quot; width=&quot;100px;&quot; alt=&quot;Singh&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Singh&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-MisterSingh&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/Alex-Dumitru&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/43738450?v=4&quot; width=&quot;100px;&quot; alt=&quot;Alex Dumitru&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Alex Dumitru&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Alex-Dumitru&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/lykhatskyi&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/18104686?v=4&quot; width=&quot;100px;&quot; alt=&quot;Anton Lykhatskyi&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Anton Lykhatskyi&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-lykhatskyi&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/EverythingAvailable&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/81002379?v=4&quot; width=&quot;100px;&quot; alt=&quot;sangwonlee&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;sangwonlee&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-EverythingAvailable&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/euberdeveloper&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/33126163?v=4&quot; width=&quot;100px;&quot; alt=&quot;Eugenio Berretta&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Eugenio Berretta&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-euberdeveloper&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/soranakk&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/3930307?v=4&quot; width=&quot;100px;&quot; alt=&quot;soranakk&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;soranakk&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-soranakk&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/backend-joonyoung&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/94430145?v=4&quot; width=&quot;100px;&quot; alt=&quot;고준영&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;고준영&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-backend-joonyoung&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt; &lt;a href=&quot;https://github.com/goldbergyoni/nodebestpractices/commits?author=backend-joonyoung&quot; title=&quot;Code&quot;&gt;💻&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/GuilhermePortella&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/59876059?v=4&quot; width=&quot;100px;&quot; alt=&quot;Guilherme Portella &quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Guilherme Portella &lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-GuilhermePortella&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCBxzOQd2v9wWfiMDrf_RQ7A&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/18497570?v=4&quot; width=&quot;100px;&quot; alt=&quot;André Esser&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;André Esser&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-Esser50K&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/ShiChenCong&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/22486446?v=4&quot; width=&quot;100px;&quot; alt=&quot;Scc&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Scc&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#translation-ShiChenCong&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://www.mauroaccornero.it&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/1875822?v=4&quot; width=&quot;100px;&quot; alt=&quot;Mauro Accornero&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;Mauro Accornero&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-mauroaccornero&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/no-yan&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/63000297?v=4&quot; width=&quot;100px;&quot; alt=&quot;no-yan&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;no-yan&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/#content-no-yan&quot; title=&quot;Content&quot;&gt;🖋&lt;/a&gt;&lt;/td&gt; 
   &lt;td align=&quot;center&quot; valign=&quot;top&quot; width=&quot;14.28%&quot;&gt;&lt;a href=&quot;https://github.com/hodbauer&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/17808632?v=4&quot; width=&quot;100px;&quot; alt=&quot;hodbauer&quot; style=&quot;max-width:100px;min-width:100px;&quot; /&gt;&lt;br /&gt;&lt;sub style=&quot;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;&quot;&gt;&lt;b&gt;hodbauer&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/translation-hodbauer&quot; title=&quot;Translation&quot;&gt;🌍&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;!-- markdownlint-restore --&gt; 
&lt;!-- prettier-ignore-end --&gt; 
&lt;!-- ALL-CONTRIBUTORS-LIST:END --&gt; 
&lt;h3&gt;Steering Committee Emeriti&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/BrunoScheufler&quot;&gt;Bruno Scheufler&lt;/a&gt; &lt;a href=&quot;https://brunoscheufler.com/&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/web.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;💻 full-stack web engineer, Node.js &amp;amp; GraphQL enthusiast&lt;/p&gt; 
&lt;br /&gt; 
&lt;img align=&quot;left&quot; width=&quot;100&quot; height=&quot;100&quot; src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/members/kyle.png&quot; /&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/js-kyle&quot;&gt;Kyle Martin&lt;/a&gt; &lt;a href=&quot;https://twitter.com/kylemartin_93&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/twitter.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.linkedin.com/in/kylemartinnz&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/linkedin.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Full Stack Developer &amp;amp; Site Reliability Engineer based in New Zealand, interested in web application security, and architecting and building Node.js applications to perform at global scale.&lt;/p&gt; 
&lt;br /&gt; 
&lt;img align=&quot;left&quot; width=&quot;100&quot; height=&quot;100&quot; src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/members/kevyn.png&quot; /&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/kevynb&quot;&gt;Kevyn Bruyere&lt;/a&gt; &lt;a href=&quot;https://www.linkedin.com/in/kevynbruyere/&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/linkedin.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Independent full-stack developer with a taste for Ops and automation.&lt;/p&gt; 
&lt;br /&gt; 
&lt;img align=&quot;left&quot; width=&quot;100&quot; height=&quot;100&quot; src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/members/sagir.png&quot; /&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/sagirk&quot;&gt;Sagir Khan&lt;/a&gt; &lt;a href=&quot;https://twitter.com/sagir_k&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/twitter.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://linkedin.com/in/sagirk&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/linkedin.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://sagirk.com&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/goldbergyoni/nodebestpractices/master/assets/images/web.svg?sanitize=true&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Deep specialist in JavaScript and its ecosystem — React, Node.js, TypeScript, GraphQL, MongoDB, pretty much anything that involves JS/JSON in any layer of the system — building products using the web platform for the world’s most recognized brands. Individual Member of the Node.js Foundation.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/ad5c9bdf07ad46fcca69fd392494c925ca045ad5c922cd8d4a600e38d6693f12/goldbergyoni/nodebestpractices" medium="image" />
      
    </item>
    
    <item>
      <title>Gar-b-age/CookLikeHOC</title>
      <link>https://github.com/Gar-b-age/CookLikeHOC</link>
      <description>&lt;p&gt;🥢像老乡鸡🐔那样做饭。已添加2026年发布的《老乡鸡菜品溯源报告 2.0中新出现的菜品。主要部分于2024年完工，非老乡鸡官方仓库。文字来自《老乡鸡菜品溯源报告》，并做归纳、编辑与整理。CookLikeHOC.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Gar-b-age/CookLikeHOC/main/banner.png&quot; alt=&quot;pic&quot; /&gt;&lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Gar-b-age/CookLikeHOC/main/docker_support/README.md&quot;&gt;&lt;strong&gt;Docker Support&lt;/strong&gt;&lt;/a&gt; | &lt;a href=&quot;https://raw.githubusercontent.com/Gar-b-age/CookLikeHOC/main/docs/development.md&quot;&gt;&lt;strong&gt;Development&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;a href=&quot;https://trendshift.io/repositories/14894&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://trendshift.io/api/badge/repositories/14894&quot; alt=&quot;Gar-b-age%2FCookLikeHOC | Trendshift&quot; style=&quot;width: 250px; height: 55px;&quot; width=&quot;125&quot; height=&quot;22.5&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;h1&gt;像老乡鸡那样做饭&lt;/h1&gt; 
&lt;h2&gt;新更新&lt;/h2&gt; 
&lt;p&gt;已添加2026年发布的&lt;a href=&quot;https://www.lxjchina.com.cn/info.php?class_id=102106&quot;&gt;《老乡鸡菜品溯源报告 2.0》&lt;/a&gt;中新出现的菜品。&lt;/p&gt; 
&lt;hr /&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/Gar-b-age/CookLikeHOC/issues/26&quot;&gt;&lt;strong&gt;一些说明&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;仓库主体部分于2024年完工，和2025年9月份的舆论事件无关。截止提交时，仓库的贡献者们与老乡鸡的唯一关系只有消费者和商家的关系。本仓库不是老乡鸡的官方仓库。如果有任何问题或意见建议，欢迎指出&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;hr /&gt; 
&lt;h2&gt;现在&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;欢迎大家来贡献实拍图&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;现已上线网页端，&lt;a href=&quot;https://cooklikehoc.soilzhu.su&quot;&gt;点击访问&lt;/a&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Run with Docker? Check it out &lt;a href=&quot;https://github.com/Gar-b-age/CookLikeHOC/tree/main/docker_support&quot;&gt;here&lt;/a&gt;, supported by &lt;a href=&quot;https://github.com/honestAnt&quot;&gt;@honestAnt&lt;/a&gt; in &lt;a href=&quot;https://github.com/Gar-b-age/CookLikeHOC/pull/141&quot;&gt;PR #141&lt;/a&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;AI 绘制的手绘图版及AI配图流程版网页： &lt;a href=&quot;https://ai.cooklikehoc.soilzhu.su&quot;&gt;点击访问&lt;/a&gt;, 手绘图由 &lt;a href=&quot;https://github.com/liucongg&quot;&gt;@liucongg&lt;/a&gt; 贡献，见 &lt;a href=&quot;https://github.com/Gar-b-age/CookLikeHOC/pull/143&quot;&gt;PR #143&lt;/a&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;p&gt;&lt;a href=&quot;https://t.me/cooklikehoc&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Gar-b-age/CookLikeHOC/main/tg.png&quot; alt=&quot;link&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;《老乡鸡菜品溯源报告》中公布的所有菜品已经全部录入完，欢迎大家查阅和补充。&lt;/p&gt; 
&lt;p&gt;文字超大段copy自&lt;a href=&quot;https://www.lxjchina.com.cn/display.asp?id=4226&quot;&gt;《老乡鸡菜品溯源报告》&lt;/a&gt;，有编辑与整理&lt;/p&gt; 
&lt;p&gt;指路隔壁 &lt;a href=&quot;https://cook.aiursoft.cn/&quot;&gt;How To Cook&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;至于为什么仓库名要叫CookLikeHOC，因为直接写Laoxiangji大概不方便阅读，而Home Original Chicken是china daily报道中所使用的老乡鸡的英文名，故简写成HOC。&lt;/p&gt; 
&lt;h2&gt;Contributor&lt;/h2&gt; 
&lt;p&gt;&lt;img src=&quot;https://contrib.rocks/image?repo=Gar-b-age/CookLikeHOC&quot; alt=&quot;cr&quot; /&gt;&lt;/p&gt; 
&lt;h2&gt;Logo&lt;/h2&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Gar-b-age/CookLikeHOC/main/logo.png&quot; alt=&quot;pic&quot; /&gt;&lt;/p&gt; 
&lt;h2&gt;Star History&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://star-history.com/#Gar-b-age/CookLikeHOC&amp;amp;Date&quot;&gt;&lt;img src=&quot;https://api.star-history.com/svg?repos=Gar-b-age/CookLikeHOC&amp;amp;type=Date&quot; alt=&quot;Star History Chart&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/6541ec2d05819d1cb1a8b89de9b630b874fab6585e4c364a8e1029ccef615647/Gar-b-age/CookLikeHOC" medium="image" />
      
    </item>
    
    <item>
      <title>piyushsachdeva/CKA-2024</title>
      <link>https://github.com/piyushsachdeva/CKA-2024</link>
      <description>&lt;p&gt;This repository contains the notes and code snippets of the CKA 2025 YouTube Playlist. The content is based on the latest 2025 curriculum and includes hands-on demos, assignments, and exam-based scenarios. I will be covering everything from the basics to the advanced level.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Certified Kubernetes Administrator(CKA) 20245&lt;/h1&gt; 
&lt;p&gt;This is the GitHub repository to host all the notes, diagrams, assignments, and resources from the CKA course published on YouTube.&lt;/p&gt; 
&lt;p&gt;Note: If you found the content helpful, consider giving the repository a star ⭐&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Checkout this &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/raw/main/%2340daysofkubernetes.md&quot;&gt;file&lt;/a&gt; for the #40daysofkubernetes challenge details&lt;/strong&gt;&lt;/p&gt; 
&lt;h2&gt;🔗 Join our community 👇&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://youtube.com/@techtutorialswithpiyush&quot;&gt;&lt;img src=&quot;https://www.freeiconspng.com/thumbs/youtube-icon/video-youtube-icon--14.png&quot; height=&quot;60px&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://discord.com/invite/FMtJ2bVRUE&quot;&gt;&lt;img src=&quot;https://img.icons8.com/color/2x/discord--v2.png&quot; height=&quot;60px&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/piyushsachdeva/&quot;&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/91791257/235086411-9ec7aa5e-c095-44ce-b9e6-57b3bc3fead2.png&quot; height=&quot;60px&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://twitter.com/thecloudopscomm&quot;&gt;&lt;img src=&quot;https://i.postimg.cc/pVqVTNJd/X-logo.png&quot; height=&quot;60px&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.linkedin.com/company/thecloudopscomm/&quot;&gt;&lt;img src=&quot;https://img.icons8.com/fluency/2x/linkedin.png&quot; height=&quot;60px&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.instagram.com/techtutorialswithpiyush/&quot;&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/91791257/235086447-47658b7b-71fa-4baf-830a-3ba9b3a76a47.png&quot; height=&quot;60px&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;🏆 #40daysofkubernetes Challenge - COMPLETED!&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;The #40daysofkubernetes challenge has been successfully completed!&lt;/strong&gt; 🎉&lt;/p&gt; 
&lt;p&gt;Congratulations to all the amazing participants who dedicated their time and effort to learn Kubernetes throughout this journey.&lt;/p&gt; 
&lt;h3&gt;🥇 Challenge Winners&lt;/h3&gt; 
&lt;h4&gt;🖊️ &lt;strong&gt;Blogging Champions&lt;/strong&gt;&lt;/h4&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&gt;Shivam Gautam&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Rahul Vadakkiniyil&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Shriram Sahu&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Teddy D&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Pratik Shinde&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Baivab Mukhopadhyay&lt;/strong&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h4&gt;👥 &lt;strong&gt;Community Champions&lt;/strong&gt;&lt;/h4&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&gt;Baivab Mukhopadhyay&lt;/strong&gt; - Discord: itzmario7320&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Priyanka&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Vivek&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Dheeman Das&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Micheal Choudhary&lt;/strong&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;A huge thanks to everyone who participated, shared their learning journey, and contributed to building this amazing community! 🙏&lt;/p&gt; 
&lt;h3&gt;Day0: Intro to the series&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://youtu.be/6_gMoe7Ik8k&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/6_gMoe7Ik8k/sddefault.jpg&quot; alt=&quot;Course Introduction&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Course Introduction&lt;/li&gt; 
 &lt;li&gt;Discord community server for assistance&lt;/li&gt; 
 &lt;li&gt;Live QnA sessions every weekend&lt;/li&gt; 
 &lt;li&gt;#40daysofkubernetes challenge&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Day 1: Docker Fundamentals&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day01&quot;&gt;Day1&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;What is Docker?&lt;/li&gt; 
 &lt;li&gt;How is it different from Virtual Machines&lt;/li&gt; 
 &lt;li&gt;Docker Architecture&lt;/li&gt; 
 &lt;li&gt;Docker flow&lt;/li&gt; 
 &lt;li&gt;Docker commands&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Day 2 Video: Dockerize an application&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day02&quot;&gt;Day2&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;What is Dockerfile, and how do you write it?&lt;/li&gt; 
 &lt;li&gt;docker pull , push, tag etc&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day3 Video: Docker Multi-Stage Builds&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day03&quot;&gt;Day3&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;How to write a dockerfile for multistage build&lt;/li&gt; 
 &lt;li&gt;Benefits of multi-stage builds&lt;/li&gt; 
 &lt;li&gt;Other docker best practices&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 4 Video: Why do We need Kubernetes?&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day04&quot;&gt;Day4&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;h2&gt;Day 5 Video: Kubernetes Architecture&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day05&quot;&gt;Day5&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Control plane VS Worker Nodes&lt;/li&gt; 
 &lt;li&gt;Overview of control plane components&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 6 Video: Install Kubernetes Cluster locally&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day06&quot;&gt;Day6&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Install Kind cluster locally&lt;/li&gt; 
 &lt;li&gt;How to access the cluster&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day7 Video: Pods in Kubernetes&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day07&quot;&gt;Day7&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;What are pods in Kubernetes?&lt;/li&gt; 
 &lt;li&gt;Containers VS Pods&lt;/li&gt; 
 &lt;li&gt;Imperative VS Declarative way for creating Kubernetes resources&lt;/li&gt; 
 &lt;li&gt;Create a sample pod using the imperative way&lt;/li&gt; 
 &lt;li&gt;Create a sample pod using the declarative way&lt;/li&gt; 
 &lt;li&gt;Inspect the pods&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day8 Video: Replicasets and Deployments in Kubernetes:&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day08&quot;&gt;Day8&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Replication Controller&lt;/li&gt; 
 &lt;li&gt;ReplicaSet&lt;/li&gt; 
 &lt;li&gt;Deployments&lt;/li&gt; 
 &lt;li&gt;How to perform Rolling updates/rollback&lt;/li&gt; 
 &lt;li&gt;Scale the deployment&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day9 Video: Services in Kubernetes:&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day09&quot;&gt;Day9&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;What are services in Kubernetes, and why do we need them?&lt;/li&gt; 
 &lt;li&gt;Node port, ClusterIP, and LoadBalancer&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 10 Video: Namespaces:&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day10&quot;&gt;Day10&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;NameSpaces&lt;/li&gt; 
 &lt;li&gt;Services and namespaces&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 11 Video: Multi-container Pods&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day11&quot;&gt;Day11&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;What are multi-container pods&lt;/li&gt; 
 &lt;li&gt;Multi-container pods pattern - sidecar/init etc&lt;/li&gt; 
 &lt;li&gt;Environment variables in Kubernetes&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 12 Video: Daemonset, Cronjob, and job&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day12&quot;&gt;Day12&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;What are Daemonset, cronjobs and Jobs&lt;/li&gt; 
 &lt;li&gt;Cron fundamentals with examples&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day13 Video: Static Pods&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day13&quot;&gt;Day13&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;What are static pods&lt;/li&gt; 
 &lt;li&gt;Labels and selectors&lt;/li&gt; 
 &lt;li&gt;Manual Scheduling&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day14 Video: Taints and Tolerations&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day14&quot;&gt;Day14&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;h2&gt;Day15 Video: Node Affinity&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day15&quot;&gt;Day15&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;h2&gt;Day16 Video: Resource Requests and Limits&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day16&quot;&gt;Day16&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;h2&gt;Day17 Video: Autoscaling in Kubernetes&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day17&quot;&gt;Day17&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Horizontal VS Vertical Autoscaling&lt;/li&gt; 
 &lt;li&gt;HPA, VPA, Cluster autoscaling, NAP&lt;/li&gt; 
 &lt;li&gt;Metrics server&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day18 Video: Probes in Kubernetes&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day18&quot;&gt;Day18&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Liveness VS Readiness Probes&lt;/li&gt; 
 &lt;li&gt;HTTP/TCP/Command-based health checks&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day19 Video: Config maps and Secrets&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day19&quot;&gt;Day19&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;concept and demo&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 20 Video: How SSL/TLS works&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day20&quot;&gt;Day20&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Symmetric VS Asymmetric encryption&lt;/li&gt; 
 &lt;li&gt;SSL certificates and Certificate Authority&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 21 Video: TLS in Kubernetes&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day21&quot;&gt;Day21&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;How TLS works in Kubernetes&lt;/li&gt; 
 &lt;li&gt;Why we need TLS in Kubernetes&lt;/li&gt; 
 &lt;li&gt;Private key and public certificates&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 22 Video: Authorization in Kubernetes&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day22&quot;&gt;Day22&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Authorization VS Authentication&lt;/li&gt; 
 &lt;li&gt;Authorization types, ABAC, RBAC, Node, Webhook&lt;/li&gt; 
 &lt;li&gt;Kubeconfig&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 23 Video: Role-based access control (RBAC)&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day23&quot;&gt;Day23&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Role and role binding&lt;/li&gt; 
 &lt;li&gt;Generate and approve the certificate&lt;/li&gt; 
 &lt;li&gt;grant access to the user&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 24 Video: Cluster role and cluster role binding&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day24&quot;&gt;Day24&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;concept and demo&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 25 Video: Service Account&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day25&quot;&gt;Day25&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;What are service accounts, and why do we use them?&lt;/li&gt; 
 &lt;li&gt;Create a service account and grant access to it&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day26 Video: Network Policies&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day26&quot;&gt;Day26&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Network policy concept&lt;/li&gt; 
 &lt;li&gt;CNI installation&lt;/li&gt; 
 &lt;li&gt;enforce network policy by creating the object&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day27 Video: Use Kubeadm to install a Kubernetes cluster&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day27&quot;&gt;Day27&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Provision underlying infrastructure to deploy a Kubernetes cluster&lt;/li&gt; 
 &lt;li&gt;Setup Master Node to deploy Kubernetes components&lt;/li&gt; 
 &lt;li&gt;Setup multiple worker nodes and join the master node&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day28 Video: Docker storage fundamentals&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Video is live, check out 👉 &lt;a href=&quot;https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day28&quot;&gt;Day28&lt;/a&gt; 👈 folder for notes and useful links ✅&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Why do we need storage in docker containers&lt;/li&gt; 
 &lt;li&gt;persistent docker storage&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day29 Video: Storage in Kubernetes&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;How storage works in Kubernetes&lt;/li&gt; 
 &lt;li&gt;hostpath volumes in Kubernetes&lt;/li&gt; 
 &lt;li&gt;Persistent volumes and Persistent volume claims&lt;/li&gt; 
 &lt;li&gt;Volume modes, Access modes, and reclaim policies for volumes&lt;/li&gt; 
 &lt;li&gt;Storage classes and provisions&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day30 Video: How does DNS work?&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;What happens when you type a website address in your browser&lt;/li&gt; 
 &lt;li&gt;different components involved in DNS&lt;/li&gt; 
 &lt;li&gt;End-to-end flow&lt;/li&gt; 
 &lt;li&gt;Important files and resources&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day31 Video: DNS in kubernetes&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;How DNS works in Kubernetes&lt;/li&gt; 
 &lt;li&gt;Core-DNS&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day32 Video: Kubernetes Networking&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;CNI , Network Add-on&lt;/li&gt; 
 &lt;li&gt;Containerd vs runc , container runtime&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 33 Video: Ingress controller and Ingress resources&lt;/h2&gt; 
&lt;h2&gt;Day 34 Video: Perform a version upgrade on a Kubernetes cluster using Kubeadm&lt;/h2&gt; 
&lt;h2&gt;Day 35 Video: Implement etcd backup and restore&lt;/h2&gt; 
&lt;h2&gt;Day 36 Video: Monitoring, Logging and Alerting&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Monitor Cluster components, Evaluate cluster and node logging&lt;/li&gt; 
 &lt;li&gt;Understand how to monitor applications, metric server&lt;/li&gt; 
 &lt;li&gt;Manage container stdout &amp;amp; stderr logs&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 37 Video: Troubleshoot application failure&lt;/h2&gt; 
&lt;h2&gt;Day 38 Video: Troubleshoot cluster component failure&lt;/h2&gt; 
&lt;h2&gt;Day 39 Video: Network Troubleshooting&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Worker node failure&lt;/li&gt; 
 &lt;li&gt;cordon, uncordon and drain (maintenance)\&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 40 Video: JSONPath, advance kubectl commands&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;JSON for beginners&lt;/li&gt; 
 &lt;li&gt;JSON v/s YAML&lt;/li&gt; 
 &lt;li&gt;JSONPATH basics&lt;/li&gt; 
 &lt;li&gt;Multiple JSONPATH queries to fetch details&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 41 Mission CKA&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Exam Pattern&lt;/li&gt; 
 &lt;li&gt;Pre-requisites&lt;/li&gt; 
 &lt;li&gt;Last-minute preparation&lt;/li&gt; 
 &lt;li&gt;Tips and Tricks&lt;/li&gt; 
 &lt;li&gt;Sample questions&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 42 Video: Realtime project: Host your own container registry on Kubernetes&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;This project will include multiple Kubernetes topics with real-time implementation.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Day 43 Video: Helm&lt;/h2&gt; 
&lt;h2&gt;Day 44 Video - Kustomize&lt;/h2&gt; 
&lt;h2&gt;Day 45 Video - StatefulSets&lt;/h2&gt; 
&lt;h2&gt;Day 46 Video - Priority class and preemption&lt;/h2&gt; 
&lt;h2&gt;Frequently asked questions:&lt;/h2&gt; 
&lt;p&gt;I&#39;ve been overwhelmed by the fantastic response to my new YouTube series on the Certified Kubernetes Administrator (CKA) exam! But with all the excitement came some questions, and I&#39;m here to address them head-on.&lt;/p&gt; 
&lt;h3&gt;1) 𝐈 𝐜𝐚𝐧𝐧𝐨𝐭 𝐚𝐟𝐟𝐨𝐫𝐝 𝐭𝐡𝐞 𝐂𝐊𝐀 𝐞𝐱𝐚𝐦 𝐢𝐭&#39;𝐬 𝐭𝐨𝐨 𝐞𝐱𝐩𝐞𝐧𝐬𝐢𝐯𝐞. 𝐒𝐡𝐨𝐮𝐥𝐝 𝐈 𝐬𝐭𝐢𝐥𝐥 𝐟𝐨𝐥𝐥𝐨𝐰 𝐚𝐥𝐨𝐧𝐠?&lt;/h3&gt; 
&lt;p&gt;The content of this playlist is based on the exam curriculum because it provides a well-organized learning path. You don&#39;t have to worry about the roadmap; you can focus on learning. Even if you are not taking the exam now, you are still gaining the hands-on knowledge that a Kubernetes administrator should have; that&#39;s good enough!&lt;/p&gt; 
&lt;h3&gt;𝟐) 𝐖𝐡𝐚𝐭 𝐚𝐫𝐞 𝐭𝐡𝐞 𝐩𝐫𝐞𝐫𝐞𝐪𝐮𝐢𝐬𝐢𝐭𝐞𝐬 𝐟𝐨𝐫 𝐭𝐡𝐢𝐬 𝐜𝐨𝐮𝐫𝐬𝐞?&lt;/h3&gt; 
&lt;p&gt;The only prerequisites are basic Linux understanding; all the other prerequisites are already covered in this series. Check out the GitHub repo below for the course content. Yes, it is absolutely free for anyone to join and follow along.&lt;/p&gt; 
&lt;h3&gt;𝟑) 𝐖𝐡𝐢𝐜𝐡 𝐂𝐥𝐨𝐮𝐝 𝐩𝐫𝐨𝐯𝐢𝐝𝐞𝐫 𝐚𝐫𝐞 𝐰𝐞 𝐮𝐬𝐢𝐧𝐠 𝐟𝐨𝐫 𝐭𝐡𝐞 𝐝𝐞𝐦𝐨?&lt;/h3&gt; 
&lt;p&gt;We will not be using any Cloud as the focus is on Kubernetes. Using a cloud service would mean the cloud provider manages the control plane, limiting learning. We will use a local Kubernetes installation on a Kind cluster and a Kubeadm installation on virtual machines.&lt;/p&gt; 
&lt;h3&gt;𝟒) 𝐀𝐫𝐞 𝐰𝐞 𝐝𝐨𝐢𝐧𝐠 𝐚𝐧𝐲 𝐫𝐞𝐚𝐥-𝐭𝐢𝐦𝐞 𝐩𝐫𝐨𝐣𝐞𝐜𝐭𝐬 𝐢𝐧 𝐭𝐡𝐢𝐬 𝐬𝐞𝐫𝐢𝐞𝐬?&lt;/h3&gt; 
&lt;p&gt;Yes, there will be a couple of real-time projects at the end of this series. We cannot do real-time full-fledged projects in Kubernetes without completing all the essential topics. That is why I added the projects at the end and hands-on tasks in almost every video.&lt;/p&gt; 
&lt;h3&gt;5) 𝐇𝐨𝐰 𝐦𝐚𝐧𝐲 𝐯𝐢𝐝𝐞𝐨𝐬 𝐰𝐢𝐥𝐥 𝐛𝐞 𝐩𝐮𝐛𝐥𝐢𝐬𝐡𝐞𝐝 𝐞𝐯𝐞𝐫𝐲 𝐰𝐞𝐞𝐤?&lt;/h3&gt; 
&lt;p&gt;I have finished recording the entire series and am editing the last few videos. I plan to publish 3 to 4 weekly videos every Monday through Thursday. I have chosen not to publish daily so that viewers following the series have time to understand the concepts, practice hands-on, document their learning, and not feel left behind.&lt;/p&gt; 
&lt;h3&gt;6) 𝐖𝐡𝐚𝐭 𝐢𝐟 𝐰𝐞 𝐚𝐫𝐞 𝐬𝐭𝐮𝐜𝐤 𝐬𝐨𝐦𝐞𝐰𝐡𝐞𝐫𝐞 𝐚𝐧𝐝 𝐧𝐞𝐞𝐝 𝐚𝐬𝐬𝐢𝐬𝐭𝐚𝐧𝐜𝐞?&lt;/h3&gt; 
&lt;p&gt;You can comment on the video by providing complete details about the issue/query, or you can open a new thread in the discord channel of help-cka-2024, and someone will help you. I also plan to host a live Q&amp;amp;A session every weekend.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/d7d0a0c7d5012aa7508f1223c7387b61a9834258b804bbe2f7b4875d669ba476/piyushsachdeva/CKA-2024" medium="image" />
      
    </item>
    
    <item>
      <title>render-examples/mysql</title>
      <link>https://github.com/render-examples/mysql</link>
      <description>&lt;p&gt;MySQL 8.0 and 5.7 on Render&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;MySQL on Render&lt;/h1&gt; 
&lt;p&gt;This is a template repository for running &lt;a href=&quot;https://www.mysql.com&quot;&gt;MySQL&lt;/a&gt; on Render.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;It uses the &lt;a href=&quot;https://hub.docker.com/r/mysql/mysql-server&quot;&gt;official&lt;/a&gt; MySQL Docker image.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://render.com/docs/disks&quot;&gt;Render Disks&lt;/a&gt; provide fast, persistent SSD storage for your database.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;MySQL runs in your &lt;a href=&quot;https://render.com/docs/private-services&quot;&gt;private network&lt;/a&gt; and isn&#39;t exposed to the public Internet.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;MySQL Versions&lt;/h2&gt; 
&lt;p&gt;The &lt;code&gt;master&lt;/code&gt; branch runs MySQL 8. You can use the &lt;code&gt;mysql-5&lt;/code&gt; branch to run MySQL 5 instead.&lt;/p&gt; 
&lt;h2&gt;Deployment&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://render.com/deploy?repo=https://github.com/render-examples/mysql&quot;&gt;&lt;img src=&quot;https://render.com/images/deploy-to-render-button.svg?sanitize=true&quot; alt=&quot;Deploy to Render&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;See &lt;a href=&quot;https://render.com/docs/deploy-mysql&quot;&gt;https://render.com/docs/deploy-mysql&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/19ca4af578549874286c38bb4d5c35db20411c8d85ce35affe62155d7d4848f3/render-examples/mysql" medium="image" />
      
    </item>
    
    <item>
      <title>autowarefoundation/autoware</title>
      <link>https://github.com/autowarefoundation/autoware</link>
      <description>&lt;p&gt;Autoware - the world&#39;s leading open-source software project for autonomous driving&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Autoware - the world&#39;s leading open-source software project for autonomous driving&lt;/h1&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://user-images.githubusercontent.com/63835446/158918717-58d6deaf-93fb-47f9-891d-e242b02cba7b.png&quot; alt=&quot;Autoware_RViz&quot; width=&quot;75%&quot; /&gt; &lt;/p&gt; 
&lt;!-- License --&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/autowarefoundation/autoware/raw/main/LICENSE&quot;&gt; &lt;img src=&quot;https://img.shields.io/github/license/autowarefoundation/autoware?style=flat&amp;amp;label=License&quot; alt=&quot;License&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;!-- Social Media --&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://discord.gg/Q94UsPvReQ&quot;&gt; &lt;img src=&quot;https://img.shields.io/discord/953808765935816715?logo=discord&amp;amp;logoColor=white&amp;amp;style=flat&amp;amp;label=Autoware%20Discord&quot; alt=&quot;Autoware Discord&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://twitter.com/intent/follow?screen_name=AutowareFdn&quot;&gt; &lt;img src=&quot;https://img.shields.io/twitter/follow/AutowareFdn?logo=x&amp;amp;logoColor=white&amp;amp;style=flat&quot; alt=&quot;Autoware Twitter / X&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.linkedin.com/company/the-autoware-foundation/&quot;&gt; &lt;img src=&quot;https://img.shields.io/badge/Linkedin-Autoware%20Foundation-0a66c2?logo=linkedin&amp;amp;logoColor=white&amp;amp;style=flat&quot; alt=&quot;Autoware Linkedin&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p&gt;Autoware is the world&#39;s leading open-source autonomous driving framework. Autoware provides a comprehensive, production-ready software stack designed to accelerate the commercial deployment of autonomous vehicles across diverse platforms and use cases.&lt;/p&gt; 
&lt;h2&gt;🚀 Get Started&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://autowarefoundation.github.io/autoware-documentation/main/installation&quot;&gt; &lt;img src=&quot;https://img.shields.io/badge/%F0%9F%93%A5_Installation-Get_Autoware_Running-2ea44f?style=for-the-badge&quot; alt=&quot;Installation&quot; /&gt;&lt;/a&gt; &amp;nbsp;&amp;nbsp; &lt;a href=&quot;https://autowarefoundation.github.io/autoware-documentation/main/demos/&quot;&gt; &lt;img src=&quot;https://img.shields.io/badge/%E2%9A%A1_Quick_Start-Try_the_Demo-1f6feb?style=for-the-badge&quot; alt=&quot;Quick Start&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;New to Autoware?&lt;/strong&gt;&lt;/p&gt; 
 &lt;ol&gt; 
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://autowarefoundation.github.io/autoware-documentation/main/installation&quot;&gt;Install Autoware&lt;/a&gt;&lt;/strong&gt; → Set up your environment and build the stack from source.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://autowarefoundation.github.io/autoware-documentation/main/demos/&quot;&gt;Run the Quick Start demo&lt;/a&gt;&lt;/strong&gt; → Drive a simulated vehicle in just a few minutes.&lt;/li&gt; 
 &lt;/ol&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Documentation&lt;/h2&gt; 
&lt;p&gt;To learn more about using or developing Autoware, refer to the &lt;a href=&quot;https://autowarefoundation.github.io/autoware-documentation/main/&quot;&gt;Autoware documentation site&lt;/a&gt;. You can find the source for the documentation in &lt;a href=&quot;https://github.com/autowarefoundation/autoware-documentation&quot;&gt;autowarefoundation/autoware-documentation&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p align=&quot;left&quot;&gt; &lt;a href=&quot;https://github.com/autowarefoundation/autoware_universe/graphs/contributors&quot;&gt; &lt;img src=&quot;https://img.shields.io/github/contributors/autowarefoundation/autoware_universe?style=flat&amp;amp;label=Autoware%20Universe%20Contributors&quot; alt=&quot;Autoware Universe Contributors&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/autowarefoundation/autoware/graphs/contributors&quot;&gt; &lt;img src=&quot;https://img.shields.io/github/contributors/autowarefoundation/autoware?style=flat&amp;amp;label=Autoware%20Contributors&quot; alt=&quot;Autoware Contributors&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;!-- Commit Activity --&gt; 
&lt;p align=&quot;left&quot;&gt; &lt;a href=&quot;https://github.com/autowarefoundation/autoware_universe/pulse&quot;&gt; &lt;img src=&quot;https://img.shields.io/github/commit-activity/m/autowarefoundation/autoware_universe?style=flat&amp;amp;label=Autoware%20Universe%20Commit%20Activity&quot; alt=&quot;Autoware Universe Activity&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/autowarefoundation/autoware/pulse&quot;&gt; &lt;img src=&quot;https://img.shields.io/github/commit-activity/m/autowarefoundation/autoware?style=flat&amp;amp;label=Autoware%20Commit%20Activity&quot; alt=&quot;Autoware Activity&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Make sure to follow the &lt;a href=&quot;https://autowarefoundation.github.io/autoware-documentation/main/contributing/&quot;&gt;Contribution Guidelines&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Take a look at Autoware&#39;s &lt;a href=&quot;https://github.com/autowarefoundation/autoware-projects/wiki#working-group-list&quot;&gt;various working groups&lt;/a&gt; to gain an understanding of any work in progress and to see how projects are managed.&lt;/li&gt; 
 &lt;li&gt;If you have any technical questions, you can start a discussion in the &lt;a href=&quot;https://github.com/autowarefoundation/autoware/discussions/categories/q-a&quot;&gt;Q&amp;amp;A category&lt;/a&gt; to request help and confirm if a potential issue is a bug or not.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Useful resources&lt;/h2&gt; 
&lt;!-- CI Reports --&gt; 
&lt;p align=&quot;left&quot;&gt; &lt;a href=&quot;https://github.com/autowarefoundation/autoware/actions/workflows/health-check.yaml?query=branch%3Amain&quot;&gt; &lt;img src=&quot;https://img.shields.io/github/actions/workflow/status/autowarefoundation/autoware/health-check.yaml?style=flat&amp;amp;label=health-check&quot; alt=&quot;health-check CI&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://app.codecov.io/gh/autowarefoundation/autoware_universe&quot;&gt; &lt;img src=&quot;https://img.shields.io/codecov/c/gh/autowarefoundation/autoware_universe?style=flat&amp;amp;label=Coverage&amp;amp;logo=codecov&amp;amp;logoColor=white&quot; alt=&quot;Code Coverage&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.autoware.org/&quot;&gt;Autoware Foundation homepage&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://autowarefoundation.github.io/autoware-documentation/main/community/support/&quot;&gt;Support guidelines&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://autowarefoundation.github.io/autoware-ci-metrics/&quot;&gt;CI metrics&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/fb7b0350b958642d3ff8a061fedb37b098fdba5ad15c07907c12d3173d66d92d/autowarefoundation/autoware" medium="image" />
      
    </item>
    
    <item>
      <title>solana-foundation/solana-verifiable-build</title>
      <link>https://github.com/solana-foundation/solana-verifiable-build</link>
      <description>&lt;p&gt;CLI tool for deterministically building and verifying executable against on-chain programs or buffer accounts&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Solana Verified Builds&lt;/h1&gt; 
&lt;p&gt;This repository demonstrates how to implement verified builds for Solana programs. Verified builds ensure that your deployed program matches exactly with your public source code, promoting transparency and security in the Solana ecosystem.&lt;/p&gt; 
&lt;h2&gt;What are Verified Builds?&lt;/h2&gt; 
&lt;p&gt;Verified builds allow developers and users to verify that a deployed Solana program matches its source code. This verification:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Ensures program authenticity&lt;/li&gt; 
 &lt;li&gt;Promotes transparency&lt;/li&gt; 
 &lt;li&gt;Builds user trust&lt;/li&gt; 
 &lt;li&gt;Makes source code discoverable&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Quick Start&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Install prerequisites:&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;Docker&lt;/li&gt; 
   &lt;li&gt;Cargo&lt;/li&gt; 
   &lt;li&gt;Solana Verify CLI (&lt;code&gt;cargo install solana-verify --locked&lt;/code&gt;)&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;For production use, prefer installing from a tagged release.&lt;/p&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li&gt;Build your program:&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;solana-verify build
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For programs that don&#39;t depend on &lt;code&gt;solana-program&lt;/code&gt; (e.g. SDK v3 or pinocchio), add the Solana CLI version in your root &lt;code&gt;Cargo.toml&lt;/code&gt; so the tool can pick the right build image:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;[workspace.metadata.cli]
solana = &quot;3.0.0&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The tool checks this first, then falls back to &lt;code&gt;Cargo.lock&lt;/code&gt; (solana-program, solana-program-error, or solana-account-info).&lt;/p&gt; 
&lt;ol start=&quot;3&quot;&gt; 
 &lt;li&gt;Deploy and verify:&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Deploy
solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID

# Verify against repository -&amp;gt; upload your build data on chain
solana-verify verify-from-repo -u $NETWORK_URL --program-id $PROGRAM_ID https://github.com/$REPO_PATH

# Trigger a remote job
solana-verify remote submit-job --program-id $PROGRAM_ID --uploader $THE_PUBKEY_THAT_UPLOADED_YOUR_BUILD_DATA
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;The legacy &lt;code&gt;--remote&lt;/code&gt; flag on &lt;code&gt;verify-from-repo&lt;/code&gt; has been deprecated. Upload your PDA with programs upgrade authority, then run the &lt;code&gt;remote submit-job&lt;/code&gt; command to queue OtterSec&#39;s worker. For a full walkthrough of the PDA workflow, see the &lt;a href=&quot;https://solana.com/docs/programs/verified-builds&quot;&gt;Solana verified builds guide&lt;/a&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Documentation&lt;/h2&gt; 
&lt;p&gt;For detailed instructions and best practices, please refer to the &lt;a href=&quot;https://solana.com/docs/programs/verified-builds&quot;&gt;official Solana documentation on verified builds&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Security Considerations&lt;/h2&gt; 
&lt;p&gt;While verified builds enhance transparency, they should not be considered a complete security solution. Always:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Review the source code&lt;/li&gt; 
 &lt;li&gt;Use trusted build environments&lt;/li&gt; 
 &lt;li&gt;Consider using governance solutions for program upgrades&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Current Verification Scope&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Build images are selected by pinned digest.&lt;/li&gt; 
 &lt;li&gt;Solana/Agave installer scripts in generated Dockerfiles are checksum pinned.&lt;/li&gt; 
 &lt;li&gt;Post-install verification of installed toolchain/platform-tools is still follow-up work.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;For responsible disclosure of bugs related to verified builds CLI, please email maintainers@ellipsislabs.xyz with a detailed description of the attack vector.&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;Contributions are welcome! Please feel free to submit a Pull Request.&lt;/p&gt; 
&lt;h2&gt;Releasing&lt;/h2&gt; 
&lt;p&gt;Use &lt;code&gt;.github/workflows/release.yml&lt;/code&gt; (&lt;code&gt;Release&lt;/code&gt;) as the canonical release path. Use &lt;code&gt;.github/workflows/build.yml&lt;/code&gt; only for manual artifact builds from a specific ref.&lt;/p&gt; 
&lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/solana-foundation/solana-verifiable-build/master/RELEASE.md&quot;&gt;RELEASE.md&lt;/a&gt; for release steps and recovery procedures.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/2aacf5e00bb2662fe34ee02be7eee74c14ed24e052fa052e83deaef47c9dc2c7/solana-foundation/solana-verifiable-build" medium="image" />
      
    </item>
    
    <item>
      <title>TechHutTV/homelab</title>
      <link>https://github.com/TechHutTV/homelab</link>
      <description>&lt;p&gt;Homelab stacks, templates, and more fun resources!&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;My Homelab Setup&lt;/h1&gt; 
&lt;p&gt;This repo contains Docker Compose stacks, configuration templates, and documentation for everything running in my homelab. It spans two servers - an Unraid NAS for media and a Proxmox node for everything else - tied together with Ubiquiti networking, self-hosted cloud services, and a full monitoring stack.&lt;/p&gt; 
&lt;p&gt;Whether you&#39;re looking for a complete Servarr media setup behind a VPN, a Frigate NVR config with Coral TPU, or just want to see how someone else organizes their self-hosted infrastructure, feel free to dig around and use whatever is helpful. This is a &lt;em&gt;work in progress&lt;/em&gt; - I still have a ton to update and add.&lt;/p&gt; 
&lt;h2&gt;Table of Contents&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/TechHutTV/homelab/main/apps/&quot;&gt;Apps&lt;/a&gt; - List of all the apps and services.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/TechHutTV/homelab/main/automations/&quot;&gt;Automations&lt;/a&gt; - n8n workflows and automation.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/TechHutTV/homelab/main/cloud/&quot;&gt;Cloud&lt;/a&gt; - NextCloud, Immich, and self-hosted cloud services.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/TechHutTV/homelab/main/homeassistant/&quot;&gt;Home Assistant&lt;/a&gt; - Smart home services and automation.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/TechHutTV/homelab/main/media/&quot;&gt;Media Server&lt;/a&gt; - Plex, Jellyfin, *arr stack, and more.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/TechHutTV/homelab/main/monitoring/&quot;&gt;Monitoring&lt;/a&gt; - Graphs and visualizations for Unraid, Proxmox, and more.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/TechHutTV/homelab/main/netbird/&quot;&gt;NetBird&lt;/a&gt; - Self-hosted zero-trust networking with PocketID.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/TechHutTV/homelab/main/proxy/&quot;&gt;Proxy Management&lt;/a&gt; - NGINX Proxy Manager, DDNS with Cloudflare, local domains, and more.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/TechHutTV/homelab/main/storage/&quot;&gt;Storage&lt;/a&gt; - Current storage and backup solution.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/TechHutTV/homelab/main/surveillance/&quot;&gt;Surveillance&lt;/a&gt; - Frigate NVR solution with Coral TPU.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Hardware&lt;/h2&gt; 
&lt;h3&gt;Compute&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;&lt;/th&gt; 
   &lt;th&gt;OpnNAS SL-R12 Pro&lt;/th&gt; 
   &lt;th&gt;Miniforum AI X1 Pro&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;OS&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Unraid&lt;/td&gt; 
   &lt;td&gt;Proxmox&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Role&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Media server, NextCloud VM&lt;/td&gt; 
   &lt;td&gt;Grafana, NPM, n8n, and other services&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://amzn.to/4qblt9y&quot;&gt;Intel Core i5-13500T&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;AMD Ryzen AI 9 HX 370&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;RAM&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://amzn.to/3Jbh2uD&quot;&gt;Crucial Pro 96GB DDR5&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;96GB SODIMM DDR5&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://amzn.to/4nPhn5d&quot;&gt;5x Seagate Exos 20TB&lt;/a&gt;, &lt;a href=&quot;https://amzn.to/3W1IFt5&quot;&gt;7x Seagate IronWolf 4TB&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://amzn.to/4hdfHzY&quot;&gt;2x WD SN580 1TB NVMe&lt;/a&gt; (mirrored boot)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Link&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://opnnas.com/#hls&quot;&gt;learn more&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://amzn.to/4n0xTOR&quot;&gt;get it here&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;The OpnNAS is an early release press model - check &lt;a href=&quot;https://opnnas.com/#hls&quot;&gt;their site&lt;/a&gt; for availability. The Miniforum handles all non-media workloads as a dedicated Proxmox node.&lt;/p&gt; 
&lt;h3&gt;Networking&lt;/h3&gt; 
&lt;p&gt;Ubiquiti sent all of this over to me. There is no way I&#39;d be able to afford all this stuff on my own dime, so note that. This setup is crazy overpowered for what I need.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Device&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;UDM Pro Max&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Primary router, gateway, and UniFi Protect NVR with 2x 8TB HDDs for camera storage.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;USW Pro Max 24 PoE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Main 24-port PoE switch powering cameras and access points.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;USW Pro XG 10 PoE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;10G aggregation switch for high-bandwidth connections between devices.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;2x U7 Pro XG&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Wi-Fi 7 access points providing wireless coverage.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;USW Lite 16 PoE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Secondary 16-port PoE switch for additional wired devices.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;details&gt; 
 &lt;summary&gt;Accessories&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;1x U-Rack-6U-TL&lt;/li&gt; 
  &lt;li&gt;1x UACC-Cable-Patch-EL-0.15M-W-24&lt;/li&gt; 
  &lt;li&gt;5x UACC-Cable-Patch-EL-3M-W&lt;/li&gt; 
  &lt;li&gt;2x UACC-Cable-Patch-EL-15M-W&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;h3&gt;Security&lt;/h3&gt; 
&lt;p&gt;Currently running two camera systems - originally fully Reolink, but added UniFi Protect after Ubiquiti sent equipment to try. See the &lt;a href=&quot;https://www.youtube.com/watch?v=2RiiKi4vjJc&quot;&gt;video overview&lt;/a&gt;.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Camera&lt;/th&gt; 
   &lt;th&gt;Details&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;3x UVC-G6-Turret-W&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Connected to the UDM Pro Max via UniFi Protect. Planning to slowly transition fully to Ubiquiti as budget allows.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Reolink PoE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://amzn.to/4d6BuGJ&quot;&gt;RLC-1224A 12MP&lt;/a&gt; and &lt;a href=&quot;https://amzn.to/4ceRKnM&quot;&gt;4K Floodlight&lt;/a&gt;. Great for the Reolink ecosystem and 3rd party services like Frigate.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Reolink NVR Kit&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://amzn.to/4d9YaWz&quot;&gt;16CH 12MP&lt;/a&gt; (my kit) - simple PoE plug-and-play solution. Kit cameras require the NVR to function. Budget option: &lt;a href=&quot;https://amzn.to/4dulGgG&quot;&gt;8CH 5MP&lt;/a&gt;.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Other Devices&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Raspberry Pi 5&lt;/strong&gt; (PoE HAT) - Twingate connector and Cloudflare DDNS updater.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Raspberry Pi 4&lt;/strong&gt; - OctoPrint for 3D printer management.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;VPS&lt;/strong&gt; (&lt;a href=&quot;https://www.hostinger.com/&quot;&gt;Hostinger KVM&lt;/a&gt;) - Self-hosted NetBird management server.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Previous hardware? See &lt;a href=&quot;https://raw.githubusercontent.com/TechHutTV/homelab/main/old_hardware.md&quot;&gt;old_hardware.md&lt;/a&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Stars&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.star-history.com/#techhuttv/homelab&amp;amp;type=date&amp;amp;legend=top-left&quot;&gt;&lt;img src=&quot;https://api.star-history.com/svg?repos=techhuttv/homelab&amp;amp;type=date&amp;amp;legend=top-left&quot; alt=&quot;Star History Chart&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/78254167147acf880a62d89bb1df5b1261ddc6fc1b0fb5f5712b18014e94529a/TechHutTV/homelab" medium="image" />
      
    </item>
    
    <item>
      <title>openai/codex-universal</title>
      <link>https://github.com/openai/codex-universal</link>
      <description>&lt;p&gt;Base docker image used in Codex environments&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;codex-universal&lt;/h1&gt; 
&lt;p&gt;&lt;code&gt;codex-universal&lt;/code&gt; is a reference implementation of the base Docker image available in &lt;a href=&quot;http://platform.openai.com/docs/codex&quot;&gt;OpenAI Codex&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;This repository is intended to help developers cutomize environments in Codex, by providing a similar image that can be pulled and run locally. This is not an identical environment but should help for debugging and development.&lt;/p&gt; 
&lt;p&gt;For more details on environment setup, see &lt;a href=&quot;http://platform.openai.com/docs/codex&quot;&gt;OpenAI Codex&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;p&gt;The Docker image is available at:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker pull ghcr.io/openai/codex-universal:latest
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This repository builds the image for both linux/amd64 and linux/arm64. However we only run the linux/amd64 version. Your installed Docker may support linux/amd64 emulation by passing the &lt;code&gt;--platform linux/amd64&lt;/code&gt; flag.&lt;/p&gt; 
&lt;p&gt;The arm64 image differs from the amd64 image in 2 ways:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;OpenJDK 10 is not available on amd64&lt;/li&gt; 
 &lt;li&gt;The arm64 image skips installing swift because of a current bug with mise&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The below script shows how can you approximate the &lt;code&gt;setup&lt;/code&gt; environment in Codex:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;# See below for environment variable options.
# This script mounts the current directory similar to how it would get cloned in.
docker run --rm -it \
    -e CODEX_ENV_PYTHON_VERSION=3.12 \
    -e CODEX_ENV_NODE_VERSION=20 \
    -e CODEX_ENV_RUST_VERSION=1.87.0 \
    -e CODEX_ENV_GO_VERSION=1.23.8 \
    -e CODEX_ENV_SWIFT_VERSION=6.2 \
    -e CODEX_ENV_RUBY_VERSION=3.4.4 \
    -e CODEX_ENV_PHP_VERSION=8.4 \
    -v $(pwd):/workspace/$(basename $(pwd)) -w /workspace/$(basename $(pwd)) \
    ghcr.io/openai/codex-universal:latest
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;codex-universal&lt;/code&gt; includes setup scripts that look for &lt;code&gt;CODEX_ENV_*&lt;/code&gt; environment variables and configures the language version accordingly.&lt;/p&gt; 
&lt;h3&gt;Configuring language runtimes&lt;/h3&gt; 
&lt;p&gt;The following environment variables can be set to configure runtime installation. Note that a limited subset of versions are supported (indicated in the table below):&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Environment variable&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
   &lt;th&gt;Supported versions&lt;/th&gt; 
   &lt;th&gt;Additional packages&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CODEX_ENV_PYTHON_VERSION&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Python version to install&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;3.10&lt;/code&gt;, &lt;code&gt;3.11.12&lt;/code&gt;, &lt;code&gt;3.12&lt;/code&gt;, &lt;code&gt;3.13&lt;/code&gt;, &lt;code&gt;3.14.0&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;pyenv&lt;/code&gt;, &lt;code&gt;poetry&lt;/code&gt;, &lt;code&gt;uv&lt;/code&gt;, &lt;code&gt;ruff&lt;/code&gt;, &lt;code&gt;black&lt;/code&gt;, &lt;code&gt;mypy&lt;/code&gt;, &lt;code&gt;pyright&lt;/code&gt;, &lt;code&gt;isort&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CODEX_ENV_NODE_VERSION&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Node.js version to install&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;18&lt;/code&gt;, &lt;code&gt;20&lt;/code&gt;, &lt;code&gt;22&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;corepack&lt;/code&gt;, &lt;code&gt;yarn&lt;/code&gt;, &lt;code&gt;pnpm&lt;/code&gt;, &lt;code&gt;npm&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CODEX_ENV_RUST_VERSION&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Rust version to install&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;1.83.0&lt;/code&gt;, &lt;code&gt;1.84.1&lt;/code&gt;, &lt;code&gt;1.85.1&lt;/code&gt;, &lt;code&gt;1.86.0&lt;/code&gt;, &lt;code&gt;1.87.0&lt;/code&gt;, &lt;code&gt;1.88.0&lt;/code&gt;, &lt;code&gt;1.89.0&lt;/code&gt;, &lt;code&gt;1.90&lt;/code&gt;, &lt;code&gt;1.91.1&lt;/code&gt;, &lt;code&gt;1.92.0&lt;/code&gt;, &lt;code&gt;1.93.0&lt;/code&gt;, &lt;code&gt;1.94.0&lt;/code&gt;, &lt;code&gt;1.95.0&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CODEX_ENV_GO_VERSION&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Go version to install&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;1.22.12&lt;/code&gt;, &lt;code&gt;1.23.8&lt;/code&gt;, &lt;code&gt;1.24.3&lt;/code&gt;, &lt;code&gt;1.25.1&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CODEX_ENV_SWIFT_VERSION&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Swift version to install&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;5.10&lt;/code&gt;, &lt;code&gt;6.1&lt;/code&gt;, &lt;code&gt;6.2&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CODEX_ENV_RUBY_VERSION&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Ruby version to install&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;3.2.3&lt;/code&gt;, &lt;code&gt;3.3.8&lt;/code&gt;, &lt;code&gt;3.4.4&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CODEX_ENV_PHP_VERSION&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;PHP version to install&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;8.4&lt;/code&gt;, &lt;code&gt;8.3&lt;/code&gt;, &lt;code&gt;8.2&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CODEX_ENV_JAVA_VERSION&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;JDK version to install&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;25&lt;/code&gt;, &lt;code&gt;24&lt;/code&gt;, &lt;code&gt;23&lt;/code&gt;, &lt;code&gt;22&lt;/code&gt;, &lt;code&gt;21&lt;/code&gt;, &lt;code&gt;17&lt;/code&gt;, &lt;code&gt;11&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;What&#39;s included&lt;/h2&gt; 
&lt;p&gt;In addition to the packages specified in the table above, the following packages are also installed:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;bun&lt;/code&gt;: 1.2.10&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;bazelisk&lt;/code&gt; / &lt;code&gt;bazel&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;erlang&lt;/code&gt;: 27.1.2&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;elixir&lt;/code&gt;: 1.18.3&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/openai/codex-universal/main/Dockerfile&quot;&gt;Dockerfile&lt;/a&gt; for the full details of installed packages.&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/openai/codex-universal/main/CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/92037f1f3848436a4ef667b2b5f6d415d67667b1e9921d9f57b45fbd019915fd/openai/codex-universal" medium="image" />
      
    </item>
    
    <item>
      <title>oxsecurity/megalinter</title>
      <link>https://github.com/oxsecurity/megalinter</link>
      <description>&lt;p&gt;🦙 MegaLinter analyzes 50 languages, 22 formats, 21 tooling formats, excessive copy-pastes, spelling mistakes and security issues in your repository sources with a GitHub Action, other CI tools or locally.&lt;/p&gt;&lt;hr&gt;&lt;div align=&quot;center&quot;&gt; 
 &lt;a href=&quot;https://megalinter.io&quot; target=&quot;blank&quot; title=&quot;Visit MegaLinter Web Site&quot;&gt; &lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/megalinter-banner.png&quot; alt=&quot;MegaLinter&quot; min-height=&quot;200px&quot; /&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;!-- header-logo-end --&gt; 
&lt;!-- mega-linter-title-start --&gt; 
&lt;h1&gt;MegaLinter, by &lt;a href=&quot;https://www.ox.security/?ref=megalinter&quot;&gt;&lt;img src=&quot;https://www.ox.security/wp-content/uploads/2022/06/logo.svg?ref=megalinter_readme&quot; alt=&quot;OX Security&quot; /&gt;&lt;/a&gt;&lt;/h1&gt; 
&lt;!-- mega-linter-title-end --&gt; 
&lt;!-- mega-linter-badges-start --&gt; 
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/github/v/release/oxsecurity/megalinter?sort=semver&quot; alt=&quot;GitHub release&quot; /&gt; &lt;a href=&quot;https://megalinter.io/flavors/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/docker%20pulls-16.1M-blue&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://npmjs.org/package/mega-linter-runner&quot;&gt;&lt;img src=&quot;https://img.shields.io/npm/dw/mega-linter-runner.svg?sanitize=true&quot; alt=&quot;Downloads/week&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/stargazers/&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/oxsecurity/megalinter?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/actions?query=workflow%3AMegaLinter+branch%3Amain&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/workflows/MegaLinter/badge.svg?branch=main&quot; alt=&quot;MegaLinter&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://codecov.io/gh/oxsecurity/megalinter&quot;&gt;&lt;img src=&quot;https://codecov.io/gh/oxsecurity/megalinter/branch/main/graph/badge.svg?sanitize=true&quot; alt=&quot;codecov&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;!-- gh-dependents-info-used-by-start --&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/raw/main/./docs/used-by-stats.md&quot;&gt;&lt;img src=&quot;https://img.shields.io/static/v1?label=Used%20by&amp;amp;message=5835&amp;amp;color=informational&amp;amp;logo=slickpic&quot; alt=&quot;Generated by github-dependents-info&quot; /&gt;&lt;/a&gt;
 &lt;!-- gh-dependents-info-used-by-end --&gt; &lt;a href=&quot;https://github.com/aquasecurity/trivy&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Trivy-secured-green?logo=docker&quot; alt=&quot;Secured with Trivy&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/graphs/contributors/&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/contributors/oxsecurity/megalinter.svg?sanitize=true&quot; alt=&quot;GitHub contributors&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/sponsors/nvuillam&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/sponsors/nvuillam&quot; alt=&quot;GitHub Sponsors&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/raw/main/.github/CONTRIBUTING.md&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square&quot; alt=&quot;PRs Welcome&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://twitter.com/intent/tweet?text=Check+MegaLinter+to+say+goodbye+to+dirty+code+in+your+projects+%3A%29+100%25+free+and+open+source+for+all+uses&amp;amp;url=https://megalinter.io/&amp;amp;via=NicolasVuillamy&amp;amp;hashtags=linters,code,quality,ci,python,java,golang,c,dotnet,kotlin,rust,scala,salesforce,terraform&quot;&gt;&lt;img src=&quot;https://img.shields.io/twitter/url/http/shields.io.svg?style=social&quot; alt=&quot;Tweet&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;!-- mega-linter-badges-end --&gt; 
&lt;!-- welcome-phrase-start --&gt; 
&lt;p&gt;MegaLinter is an &lt;strong&gt;open-source&lt;/strong&gt; tool for &lt;strong&gt;CI/CD workflows&lt;/strong&gt; that analyzes the &lt;strong&gt;consistency of your code&lt;/strong&gt;, &lt;strong&gt;IaC&lt;/strong&gt;, &lt;strong&gt;configuration&lt;/strong&gt;, and &lt;strong&gt;scripts&lt;/strong&gt; in your repository to &lt;strong&gt;ensure all your project sources are clean and formatted&lt;/strong&gt;, no matter which IDE or toolbox is used by your developers. Powered by &lt;a href=&quot;https://www.ox.security/?ref=megalinter&quot;&gt;&lt;strong&gt;OX Security&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Supports &lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#languages&quot;&gt;&lt;strong&gt;63&lt;/strong&gt; languages&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#formats&quot;&gt;&lt;strong&gt;21&lt;/strong&gt; formats&lt;/a&gt;, &lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#tooling-formats&quot;&gt;&lt;strong&gt;19&lt;/strong&gt; tooling formats&lt;/a&gt;, and is &lt;strong&gt;ready to use out of the box&lt;/strong&gt; as a GitHub Action or with any CI system. It is &lt;strong&gt;highly configurable&lt;/strong&gt; and &lt;strong&gt;free for all uses&lt;/strong&gt;.&lt;/p&gt; 
&lt;p&gt;MegaLinter has &lt;strong&gt;native integrations&lt;/strong&gt; with many major CI/CD tools.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/GitHubCommentReporter.md&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/integrations/github.png?raw=true%3E&quot; alt=&quot;GitHub&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/GitlabCommentReporter.md&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/integrations/gitlab.png?raw=true%3E&quot; alt=&quot;GitLab&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/AzureCommentReporter.md&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/integrations/azure.png?raw=true%3E&quot; alt=&quot;Azure&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/BitbucketCommentReporter.md&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/integrations/bitbucket.png?raw=true%3E&quot; alt=&quot;Bitbucket&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/install-jenkins.md&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/integrations/jenkins.png?raw=true%3E&quot; alt=&quot;Jenkins&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/install-drone.md&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/integrations/drone.png?raw=true%3E&quot; alt=&quot;Drone&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/install-concourse.md&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/integrations/concourse.png?raw=true%3E&quot; alt=&quot;Concourse&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/install-docker.md&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/integrations/docker.png?raw=true%3E&quot; alt=&quot;Docker&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/SarifReporter.md&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/integrations/sarif.png?raw=true%3E&quot; alt=&quot;SARIF&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/ApiReporter.md&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/integrations/grafana.png?raw=true%3E&quot; alt=&quot;Grafana&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;!-- welcome-phrase-end --&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/MegaLinter-banner-Medium.gif?raw=true&quot; alt=&quot;MegaLinter Presentation GIF&quot; /&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;📣 &lt;strong&gt;MegaLinter 9.5.0 is out!&lt;/strong&gt; Discover the new features and security recommendations in the &lt;a href=&quot;https://github.com/oxsecurity/megalinter/issues/7835&quot;&gt;release announcement&lt;/a&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;ul&gt; 
 &lt;li&gt;Use the new &lt;a href=&quot;https://megalinter.io/latest/llm-advisor/&quot;&gt;LLM Advisor&lt;/a&gt; that will tell you how to fix linters issues&lt;/li&gt; 
 &lt;li&gt;Create your own &lt;a href=&quot;https://megalinter.io/latest/custom-flavors/&quot;&gt;MegaLinter Custom Flavors&lt;/a&gt; to improve performance&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- online-doc-start --&gt; 
&lt;p&gt;Before you go further, see the &lt;a href=&quot;https://megalinter.io/&quot;&gt;&lt;strong&gt;online documentation website, which offers much easier navigation than this README&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;!-- online-doc-end --&gt; 
&lt;!-- table-of-contents-start --&gt; 
&lt;h2&gt;Table of Contents&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#why-megalinter&quot;&gt;Why MegaLinter&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#quick-start&quot;&gt;Quick Start&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#supported-linters&quot;&gt;Supported Linters&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#languages&quot;&gt;Languages&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#formats&quot;&gt;Formats&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#tooling-formats&quot;&gt;Tooling formats&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#other&quot;&gt;Other&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#installation&quot;&gt;Installation&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#assisted-installation&quot;&gt;Assisted installation&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#which-version-to-use-&quot;&gt;Which version to use ?&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#github-action&quot;&gt;GitHub Action&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#gitlab-ci&quot;&gt;GitLab CI&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#azure-pipelines&quot;&gt;Azure Pipelines&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#single-repository&quot;&gt;Single Repository&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#central-repository&quot;&gt;Central Repository&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#pull-request-comments&quot;&gt;Pull Request Comments&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#detailed-tutorial&quot;&gt;Detailed Tutorial&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#bitbucket-pipelines&quot;&gt;Bitbucket Pipelines&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#jenkins&quot;&gt;Jenkins&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#concourse&quot;&gt;Concourse&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#pipeline-step&quot;&gt;Pipeline step&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#use-it-as-a-reusable-task&quot;&gt;Use it as a reusable task&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#drone-ci&quot;&gt;Drone CI&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#optional-adjusting-trigger-rules&quot;&gt;(Optional) Adjusting trigger rules&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#docker-container&quot;&gt;Docker container&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#run-megalinter-locally&quot;&gt;Run MegaLinter locally&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#configuration&quot;&gt;Configuration&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#mega-linteryml-file&quot;&gt;.mega-linter.yml file&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#common-variables&quot;&gt;Common variables&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#activation-and-deactivation&quot;&gt;Activation and deactivation&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#filter-linted-files&quot;&gt;Filter linted files&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#apply-fixes&quot;&gt;Apply fixes&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#apply-fixes-issues&quot;&gt;Apply fixes issues&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#notes&quot;&gt;Notes&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#linter-specific-variables&quot;&gt;Linter specific variables&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#pre-commands&quot;&gt;Pre-commands&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#post-commands&quot;&gt;Post-commands&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#environment-variables-security&quot;&gt;Environment variables security&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#secured-env-variables&quot;&gt;Secured env variables&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#secured-configuration-examples&quot;&gt;Secured configuration examples&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#default-secured-variables&quot;&gt;Default secured variables&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#unhide-variables-for-linters&quot;&gt;Unhide variables for linters&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#cli-lint-mode&quot;&gt;CLI lint mode&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#reporters&quot;&gt;Reporters&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#flavors&quot;&gt;Flavors&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#badge&quot;&gt;Badge&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#markdown&quot;&gt;Markdown&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#restructuredtext&quot;&gt;reStructuredText&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#plugins&quot;&gt;Plugins&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#external-plugins-catalog&quot;&gt;External Plugins Catalog&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#use-external-plugins&quot;&gt;Use external plugins&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#example&quot;&gt;Example&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#create-your-own-plugin&quot;&gt;Create your own plugin&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#limitations&quot;&gt;Limitations&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#they-talk-about-megalinter&quot;&gt;They talk about MegaLinter&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#english-articles&quot;&gt;English articles&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#french-articles&quot;&gt;French articles&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#videos&quot;&gt;Videos&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#web-sites&quot;&gt;Web Sites&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#linters&quot;&gt;Linters&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#frequently-asked-questions&quot;&gt;Frequently Asked Questions&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#how-to-contribute&quot;&gt;How to contribute&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#special-thanks&quot;&gt;Special thanks&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#maintainers&quot;&gt;Maintainers&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#contributors&quot;&gt;Contributors&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#open-source-teams&quot;&gt;Open-source teams&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#super-linter-team&quot;&gt;Super-Linter team&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#license&quot;&gt;License&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#megalinter-vs-super-linter&quot;&gt;MegaLinter vs Super-Linter&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#security&quot;&gt;Security&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#performance&quot;&gt;Performance&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#more-languages-and-formats-linted&quot;&gt;More languages and formats linted&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#automatically-apply-formatting-and-fixes&quot;&gt;Automatically apply formatting and fixes&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#run-locally&quot;&gt;Run locally&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#reports&quot;&gt;Reports&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#capabilities&quot;&gt;Capabilities&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#additional-reporters&quot;&gt;Additional Reporters&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#enhanced-configuration&quot;&gt;Enhanced configuration&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#enhanced-documentation&quot;&gt;Enhanced documentation&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#plugin-management&quot;&gt;Plugin management&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#simplify-architecture-and-evolutionary-maintenance&quot;&gt;Simplify architecture and evolutionary maintenance&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#improve-robustness--stability&quot;&gt;Improve robustness &amp;amp; stability&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- table-of-contents-end --&gt; 
&lt;h2&gt;Why MegaLinter&lt;/h2&gt; 
&lt;p&gt;Projects need to contain clean code in order to &lt;strong&gt;avoid technical debt&lt;/strong&gt;, which makes &lt;strong&gt;ongoing maintenance harder and more time-consuming&lt;/strong&gt;.&lt;/p&gt; 
&lt;p&gt;By using &lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#supported-linters&quot;&gt;&lt;strong&gt;code formatters and code linters&lt;/strong&gt;&lt;/a&gt;, you ensure that your &lt;strong&gt;codebase is easier to read&lt;/strong&gt; and &lt;strong&gt;follows best practices&lt;/strong&gt;, from kickoff through each step of the project lifecycle.&lt;/p&gt; 
&lt;p&gt;Not all developers use linters in their IDEs, which makes code reviews harder and longer to process.&lt;/p&gt; 
&lt;p&gt;By using &lt;strong&gt;MegaLinter&lt;/strong&gt;, you&#39;ll enjoy the following benefits for your team:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;At &lt;strong&gt;each pull request&lt;/strong&gt;, it &lt;strong&gt;automatically analyzes all updated code across all languages&lt;/strong&gt;.&lt;/li&gt; 
 &lt;li&gt;By reading error logs, &lt;strong&gt;developers learn best practices&lt;/strong&gt; for the languages they use.&lt;/li&gt; 
 &lt;li&gt;The &lt;a href=&quot;https://megalinter.io/&quot;&gt;&lt;strong&gt;MegaLinter documentation&lt;/strong&gt;&lt;/a&gt; provides a &lt;strong&gt;list of IDE plugins for each linter&lt;/strong&gt;, so developers know which linter and plugins to install.&lt;/li&gt; 
 &lt;li&gt;MegaLinter &lt;strong&gt;works out of the box&lt;/strong&gt; after a &lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#quick-start&quot;&gt;&lt;strong&gt;quick setup&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Formatting and fixes&lt;/strong&gt; can be automatically &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-apply-fixes.md&quot;&gt;&lt;strong&gt;applied directly to the Git branch&lt;/strong&gt;&lt;/a&gt; or &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/UpdatedSourcesReporter.md&quot;&gt;&lt;strong&gt;provided in reports&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;This tool is &lt;strong&gt;100% open source&lt;/strong&gt; and &lt;strong&gt;free for all uses&lt;/strong&gt; (personal, professional, public, and private repositories).&lt;/li&gt; 
 &lt;li&gt;MegaLinter can run on &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/install-assisted.md&quot;&gt;&lt;strong&gt;any CI tool&lt;/strong&gt;&lt;/a&gt; and be &lt;a href=&quot;https://megalinter.io/mega-linter-runner/&quot;&gt;&lt;strong&gt;run locally&lt;/strong&gt;&lt;/a&gt;: &lt;strong&gt;no need to authorize an external application&lt;/strong&gt;, and &lt;strong&gt;your codebase never leaves your tooling ecosystem&lt;/strong&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- quick-start-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Quick Start with MegaLinter
description: Setup MegaLinter in 5 minutes thanks to its assisted installation tool
---
--&gt; 
&lt;h2&gt;Quick Start&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Run &lt;code&gt;npx mega-linter-runner --install&lt;/code&gt; to generate configuration files (you need &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;Node.js&lt;/a&gt; installed).&lt;/li&gt; 
 &lt;li&gt;Commit, push, and create a pull request.&lt;/li&gt; 
 &lt;li&gt;Watch!&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/mega-linter-runner-generator.gif?raw=true&quot; alt=&quot;Runner Install&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;:&lt;/p&gt; 
&lt;!-- # MAJOR-RELEASE-IMPACTED --&gt; 
&lt;ul&gt; 
 &lt;li&gt;This repo is a hard fork of &lt;a href=&quot;https://github.com/super-linter/super-linter&quot;&gt;GitHub Super-Linter&lt;/a&gt;, rewritten in Python to add &lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#mega-linter-vs-super-linter&quot;&gt;many additional features&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;If you are a Super-Linter user, you can transparently &lt;strong&gt;switch to MegaLinter and keep the same configuration&lt;/strong&gt; (just replace &lt;code&gt;super-linter/super-linter@v3&lt;/code&gt; with &lt;code&gt;oxsecurity/megalinter@v9&lt;/code&gt; in your GitHub Action YAML file, &lt;a href=&quot;https://github.com/nvuillam/npm-groovy-lint/pull/109&quot;&gt;like on this PR&lt;/a&gt;).&lt;/li&gt; 
 &lt;li&gt;If you want to use MegaLinter&#39;s extra features (recommended), please take 5 minutes to use the &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/install-assisted.md&quot;&gt;assisted installation&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;For a beginner-friendly example of getting started with MegaLinter, check out &lt;a href=&quot;https://ayyjohn.com/posts/linting-a-jekyll-blog-with-mega-linter&quot;&gt;this blog post&lt;/a&gt; by Alec Johnson.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- quick-start-section-end --&gt; 
&lt;!-- supported-linters-section-start --&gt; 
&lt;!-- markdown-headers
---
title: List of the 100+ supported linters embedded in MegaLinter
description: Full list of all linters for all languages and formats that are available in MegaLinter
---
--&gt; 
&lt;h2&gt;Supported Linters&lt;/h2&gt; 
&lt;p&gt;All linters are integrated into the &lt;a href=&quot;https://hub.docker.com/r/oxsecurity/megalinter&quot;&gt;MegaLinter Docker image&lt;/a&gt;, which is frequently updated with their latest versions.&lt;/p&gt; 
&lt;!-- languages-section-start--&gt; 
&lt;!-- linters-table-start --&gt; 
&lt;h3&gt;Languages&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;
    &lt;!-- --&gt;&lt;/th&gt; 
   &lt;th&gt;Language&lt;/th&gt; 
   &lt;th&gt;Linter&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Additional&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/bash.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bash.md&quot;&gt;&lt;strong&gt;BASH&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bash_bash_exec.md&quot;&gt;&lt;strong&gt;bash-exec&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bash_bash_exec.md&quot;&gt;&lt;em&gt;BASH_EXEC&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/bash.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bash.md&quot;&gt;&lt;strong&gt;BASH&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bash_shellcheck.md&quot;&gt;&lt;strong&gt;shellcheck&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bash_shellcheck.md&quot;&gt;&lt;em&gt;BASH_SHELLCHECK&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/koalaman/shellcheck&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/koalaman/shellcheck?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/bash.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bash.md&quot;&gt;&lt;strong&gt;BASH&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bash_shfmt.md&quot;&gt;&lt;strong&gt;shfmt&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bash_shfmt.md&quot;&gt;&lt;em&gt;BASH_SHFMT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/mvdan/sh&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/mvdan/sh?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/c.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/c.md&quot;&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/c_cppcheck.md&quot;&gt;&lt;strong&gt;cppcheck&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/c_cppcheck.md&quot;&gt;&lt;em&gt;C_CPPCHECK&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/c.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/c.md&quot;&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/c_cpplint.md&quot;&gt;&lt;strong&gt;cpplint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/c_cpplint.md&quot;&gt;&lt;em&gt;C_CPPLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/cpplint/cpplint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/cpplint/cpplint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/c.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/c.md&quot;&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/c_clang_format.md&quot;&gt;&lt;strong&gt;clang-format&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/c_clang_format.md&quot;&gt;&lt;em&gt;C_CLANG_FORMAT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/llvm/llvm-project&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/llvm/llvm-project?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/clojure.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/clojure.md&quot;&gt;&lt;strong&gt;CLOJURE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/clojure_clj_kondo.md&quot;&gt;&lt;strong&gt;clj-kondo&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/clojure_clj_kondo.md&quot;&gt;&lt;em&gt;CLOJURE_CLJ_KONDO&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/borkdude/clj-kondo&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/borkdude/clj-kondo?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/clojure.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/clojure.md&quot;&gt;&lt;strong&gt;CLOJURE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/clojure_cljstyle.md&quot;&gt;&lt;strong&gt;cljstyle&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/clojure_cljstyle.md&quot;&gt;&lt;em&gt;CLOJURE_CLJSTYLE&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/greglook/cljstyle&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/greglook/cljstyle?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/coffee.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/coffee.md&quot;&gt;&lt;strong&gt;COFFEE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/coffee_coffeelint.md&quot;&gt;&lt;strong&gt;coffeelint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/coffee_coffeelint.md&quot;&gt;&lt;em&gt;COFFEE_COFFEELINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/clutchski/coffeelint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/clutchski/coffeelint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/cpp.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cpp.md&quot;&gt;&lt;strong&gt;C++&lt;/strong&gt; (CPP)&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cpp_cppcheck.md&quot;&gt;&lt;strong&gt;cppcheck&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cpp_cppcheck.md&quot;&gt;&lt;em&gt;CPP_CPPCHECK&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/cpp.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cpp.md&quot;&gt;&lt;strong&gt;C++&lt;/strong&gt; (CPP)&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cpp_cpplint.md&quot;&gt;&lt;strong&gt;cpplint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cpp_cpplint.md&quot;&gt;&lt;em&gt;CPP_CPPLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/cpplint/cpplint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/cpplint/cpplint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/cpp.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cpp.md&quot;&gt;&lt;strong&gt;C++&lt;/strong&gt; (CPP)&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cpp_clang_format.md&quot;&gt;&lt;strong&gt;clang-format&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cpp_clang_format.md&quot;&gt;&lt;em&gt;CPP_CLANG_FORMAT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/llvm/llvm-project&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/llvm/llvm-project?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/csharp.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/csharp.md&quot;&gt;&lt;strong&gt;C#&lt;/strong&gt; (CSHARP)&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/csharp_dotnet_format.md&quot;&gt;&lt;strong&gt;dotnet-format&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/csharp_dotnet_format.md&quot;&gt;&lt;em&gt;CSHARP_DOTNET_FORMAT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/dotnet/sdk&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/dotnet/sdk?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/csharp.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/csharp.md&quot;&gt;&lt;strong&gt;C#&lt;/strong&gt; (CSHARP)&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/csharp_csharpier.md&quot;&gt;&lt;strong&gt;csharpier&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/csharp_csharpier.md&quot;&gt;&lt;em&gt;CSHARP_CSHARPIER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/belav/csharpier&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/belav/csharpier?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/csharp.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/csharp.md&quot;&gt;&lt;strong&gt;C#&lt;/strong&gt; (CSHARP)&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/csharp_roslynator.md&quot;&gt;&lt;strong&gt;roslynator&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/csharp_roslynator.md&quot;&gt;&lt;em&gt;CSHARP_ROSLYNATOR&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/dotnet/Roslynator&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/dotnet/Roslynator?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/dart.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/dart.md&quot;&gt;&lt;strong&gt;DART&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/dart_dartanalyzer.md&quot;&gt;&lt;strong&gt;dartanalyzer&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/dart_dartanalyzer.md&quot;&gt;&lt;em&gt;DART_DARTANALYZER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/dart-lang/sdk&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/dart-lang/sdk?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/go.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/go.md&quot;&gt;&lt;strong&gt;GO&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/go_golangci_lint.md&quot;&gt;&lt;strong&gt;golangci-lint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/go_golangci_lint.md&quot;&gt;&lt;em&gt;GO_GOLANGCI_LINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/golangci/golangci-lint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/golangci/golangci-lint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/go.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/go.md&quot;&gt;&lt;strong&gt;GO&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/go_revive.md&quot;&gt;&lt;strong&gt;revive&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/go_revive.md&quot;&gt;&lt;em&gt;GO_REVIVE&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/mgechev/revive&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/mgechev/revive?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/groovy.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/groovy.md&quot;&gt;&lt;strong&gt;GROOVY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/groovy_npm_groovy_lint.md&quot;&gt;&lt;strong&gt;npm-groovy-lint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/groovy_npm_groovy_lint.md&quot;&gt;&lt;em&gt;GROOVY_NPM_GROOVY_LINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/nvuillam/npm-groovy-lint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/nvuillam/npm-groovy-lint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/java.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/java.md&quot;&gt;&lt;strong&gt;JAVA&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/java_checkstyle.md&quot;&gt;&lt;strong&gt;checkstyle&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/java_checkstyle.md&quot;&gt;&lt;em&gt;JAVA_CHECKSTYLE&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/checkstyle/checkstyle&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/checkstyle/checkstyle?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/java.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/java.md&quot;&gt;&lt;strong&gt;JAVA&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/java_pmd.md&quot;&gt;&lt;strong&gt;pmd&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/java_pmd.md&quot;&gt;&lt;em&gt;JAVA_PMD&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/pmd/pmd&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/pmd/pmd?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/javascript.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/javascript.md&quot;&gt;&lt;strong&gt;JAVASCRIPT&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/javascript_eslint.md&quot;&gt;&lt;strong&gt;eslint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/javascript_eslint.md&quot;&gt;&lt;em&gt;JAVASCRIPT_ES&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/eslint/eslint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/eslint/eslint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/javascript.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/javascript.md&quot;&gt;&lt;strong&gt;JAVASCRIPT&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/javascript_standard.md&quot;&gt;&lt;strong&gt;standard&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/javascript_standard.md&quot;&gt;&lt;em&gt;JAVASCRIPT_STANDARD&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/standard/standard&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/standard/standard?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/javascript.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/javascript.md&quot;&gt;&lt;strong&gt;JAVASCRIPT&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/javascript_prettier.md&quot;&gt;&lt;strong&gt;prettier&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/javascript_prettier.md&quot;&gt;&lt;em&gt;JAVASCRIPT_PRETTIER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/prettier/prettier&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/prettier/prettier?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/jsx.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/jsx.md&quot;&gt;&lt;strong&gt;JSX&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/jsx_eslint.md&quot;&gt;&lt;strong&gt;eslint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/jsx_eslint.md&quot;&gt;&lt;em&gt;JSX_ESLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/Rel1cx/eslint-react&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/Rel1cx/eslint-react?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/kotlin.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kotlin.md&quot;&gt;&lt;strong&gt;KOTLIN&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kotlin_ktlint.md&quot;&gt;&lt;strong&gt;ktlint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kotlin_ktlint.md&quot;&gt;&lt;em&gt;KOTLIN_KTLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/pinterest/ktlint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/pinterest/ktlint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/kotlin.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kotlin.md&quot;&gt;&lt;strong&gt;KOTLIN&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kotlin_detekt.md&quot;&gt;&lt;strong&gt;detekt&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kotlin_detekt.md&quot;&gt;&lt;em&gt;KOTLIN_DETEKT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/detekt/detekt&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/detekt/detekt?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/lua.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/lua.md&quot;&gt;&lt;strong&gt;LUA&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/lua_luacheck.md&quot;&gt;&lt;strong&gt;luacheck&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/lua_luacheck.md&quot;&gt;&lt;em&gt;LUA_LUACHECK&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/lunarmodules/luacheck&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/lunarmodules/luacheck?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/lua.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/lua.md&quot;&gt;&lt;strong&gt;LUA&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/lua_selene.md&quot;&gt;&lt;strong&gt;selene&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/lua_selene.md&quot;&gt;&lt;em&gt;LUA_SELENE&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: &lt;https://github.com/Kampfkarren/selene/issues/662&gt;&quot;&gt;🚫&lt;/span&gt; &lt;a href=&quot;https://github.com/Kampfkarren/selene&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/Kampfkarren/selene?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/lua.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/lua.md&quot;&gt;&lt;strong&gt;LUA&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/lua_stylua.md&quot;&gt;&lt;strong&gt;stylua&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/lua_stylua.md&quot;&gt;&lt;em&gt;LUA_STYLUA&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/JohnnyMorganz/StyLua&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/JohnnyMorganz/StyLua?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/makefile.md&quot;&gt;&lt;strong&gt;MAKEFILE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/makefile_checkmake.md&quot;&gt;&lt;strong&gt;checkmake&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/makefile_checkmake.md&quot;&gt;&lt;em&gt;MAKEFILE_CHECKMAKE&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: Security issues: &lt;https://github.com/checkmake/checkmake/issues/99&gt;&quot;&gt;🚫&lt;/span&gt; &lt;a href=&quot;https://github.com/checkmake/checkmake&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/checkmake/checkmake?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/perl.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/perl.md&quot;&gt;&lt;strong&gt;PERL&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/perl_perlcritic.md&quot;&gt;&lt;strong&gt;perlcritic&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/perl_perlcritic.md&quot;&gt;&lt;em&gt;PERL_PERLCRITIC&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/Perl-Critic/Perl-Critic&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/Perl-Critic/Perl-Critic?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/php.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php.md&quot;&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php_phpcs.md&quot;&gt;&lt;strong&gt;phpcs&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php_phpcs.md&quot;&gt;&lt;em&gt;PHP_PHPCS&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/PHPCSStandards/PHP_CodeSniffer&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/PHPCSStandards/PHP_CodeSniffer?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/php.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php.md&quot;&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php_phpstan.md&quot;&gt;&lt;strong&gt;phpstan&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php_phpstan.md&quot;&gt;&lt;em&gt;PHP_PHPSTAN&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/phpstan/phpstan&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/phpstan/phpstan?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/php.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php.md&quot;&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php_psalm.md&quot;&gt;&lt;strong&gt;psalm&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php_psalm.md&quot;&gt;&lt;em&gt;PHP_PSALM&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/vimeo/psalm&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/vimeo/psalm?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/php.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php.md&quot;&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php_phplint.md&quot;&gt;&lt;strong&gt;phplint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php_phplint.md&quot;&gt;&lt;em&gt;PHP_PHPLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/overtrue/phplint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/overtrue/phplint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/php.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php.md&quot;&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php_php_cs_fixer.md&quot;&gt;&lt;strong&gt;php-cs-fixer&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/php_php_cs_fixer.md&quot;&gt;&lt;em&gt;PHP_PHPCSFIXER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/PHP-CS-Fixer/PHP-CS-Fixer&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/PHP-CS-Fixer/PHP-CS-Fixer?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/powershell.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/powershell.md&quot;&gt;&lt;strong&gt;POWERSHELL&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/powershell_powershell.md&quot;&gt;&lt;strong&gt;powershell&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/powershell_powershell.md&quot;&gt;&lt;em&gt;POWERSHELL_POWERSHELL&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/PowerShell/PSScriptAnalyzer&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/PowerShell/PSScriptAnalyzer?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/powershell.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/powershell.md&quot;&gt;&lt;strong&gt;POWERSHELL&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/powershell_powershell_formatter.md&quot;&gt;&lt;strong&gt;powershell_formatter&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/powershell_powershell_formatter.md&quot;&gt;&lt;em&gt;POWERSHELL_POWERSHELL_FORMATTER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/PowerShell/PSScriptAnalyzer&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/PowerShell/PSScriptAnalyzer?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/python.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python.md&quot;&gt;&lt;strong&gt;PYTHON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_pylint.md&quot;&gt;&lt;strong&gt;pylint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_pylint.md&quot;&gt;&lt;em&gt;PYTHON_PYLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/pylint-dev/pylint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/pylint-dev/pylint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/python.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python.md&quot;&gt;&lt;strong&gt;PYTHON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_black.md&quot;&gt;&lt;strong&gt;black&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_black.md&quot;&gt;&lt;em&gt;PYTHON_BLACK&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/psf/black&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/psf/black?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/python.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python.md&quot;&gt;&lt;strong&gt;PYTHON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_flake8.md&quot;&gt;&lt;strong&gt;flake8&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_flake8.md&quot;&gt;&lt;em&gt;PYTHON_FLAKE8&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/PyCQA/flake8&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/PyCQA/flake8?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/python.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python.md&quot;&gt;&lt;strong&gt;PYTHON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_isort.md&quot;&gt;&lt;strong&gt;isort&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_isort.md&quot;&gt;&lt;em&gt;PYTHON_ISORT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/PyCQA/isort&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/PyCQA/isort?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/python.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python.md&quot;&gt;&lt;strong&gt;PYTHON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_bandit.md&quot;&gt;&lt;strong&gt;bandit&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_bandit.md&quot;&gt;&lt;em&gt;PYTHON_BANDIT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/PyCQA/bandit&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/PyCQA/bandit?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/python.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python.md&quot;&gt;&lt;strong&gt;PYTHON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_mypy.md&quot;&gt;&lt;strong&gt;mypy&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_mypy.md&quot;&gt;&lt;em&gt;PYTHON_MYPY&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/python/mypy&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/python/mypy?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/python.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python.md&quot;&gt;&lt;strong&gt;PYTHON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_nbqa.md&quot;&gt;&lt;strong&gt;nbqa&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_nbqa.md&quot;&gt;&lt;em&gt;PYTHON_NBQA_MYPY&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/nbQA-dev/nbQA&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/nbQA-dev/nbQA?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/python.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python.md&quot;&gt;&lt;strong&gt;PYTHON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_pyright.md&quot;&gt;&lt;strong&gt;pyright&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_pyright.md&quot;&gt;&lt;em&gt;PYTHON_PYRIGHT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/microsoft/pyright&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/microsoft/pyright?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/python.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python.md&quot;&gt;&lt;strong&gt;PYTHON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_ruff.md&quot;&gt;&lt;strong&gt;ruff&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_ruff.md&quot;&gt;&lt;em&gt;PYTHON_RUFF&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/astral-sh/ruff&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/astral-sh/ruff?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/python.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python.md&quot;&gt;&lt;strong&gt;PYTHON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_ruff_format.md&quot;&gt;&lt;strong&gt;ruff-format&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/python_ruff_format.md&quot;&gt;&lt;em&gt;PYTHON_RUFF_FORMAT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/astral-sh/ruff&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/astral-sh/ruff?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/r.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/r.md&quot;&gt;&lt;strong&gt;R&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/r_lintr.md&quot;&gt;&lt;strong&gt;lintr&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/r_lintr.md&quot;&gt;&lt;em&gt;R_LINTR&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/r-lib/lintr&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/r-lib/lintr?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/raku.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/raku.md&quot;&gt;&lt;strong&gt;RAKU&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/raku_raku.md&quot;&gt;&lt;strong&gt;raku&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/raku_raku.md&quot;&gt;&lt;em&gt;RAKU_RAKU&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/rakudo/rakudo&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/rakudo/rakudo?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/ruby.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/ruby.md&quot;&gt;&lt;strong&gt;RUBY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/ruby_rubocop.md&quot;&gt;&lt;strong&gt;rubocop&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/ruby_rubocop.md&quot;&gt;&lt;em&gt;RUBY_RUBOCOP&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/rubocop-hq/rubocop&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/rubocop-hq/rubocop?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/rust.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rust.md&quot;&gt;&lt;strong&gt;RUST&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rust_clippy.md&quot;&gt;&lt;strong&gt;clippy&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rust_clippy.md&quot;&gt;&lt;em&gt;RUST_CLIPPY&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/rust-lang/rust-clippy&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/rust-lang/rust-clippy?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/salesforce.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce.md&quot;&gt;&lt;strong&gt;SALESFORCE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_code_analyzer_apex.md&quot;&gt;&lt;strong&gt;code-analyzer-apex&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_code_analyzer_apex.md&quot;&gt;&lt;em&gt;SALESFORCE_CODE_ANALYZER_APEX&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/forcedotcom/code-analyzer&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/forcedotcom/code-analyzer?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/salesforce.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce.md&quot;&gt;&lt;strong&gt;SALESFORCE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_code_analyzer_aura.md&quot;&gt;&lt;strong&gt;code-analyzer-aura&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_code_analyzer_aura.md&quot;&gt;&lt;em&gt;SALESFORCE_CODE_ANALYZER_AURA&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/forcedotcom/code-analyzer&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/forcedotcom/code-analyzer?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/salesforce.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce.md&quot;&gt;&lt;strong&gt;SALESFORCE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_code_analyzer_lwc.md&quot;&gt;&lt;strong&gt;code-analyzer-lwc&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_code_analyzer_lwc.md&quot;&gt;&lt;em&gt;SALESFORCE_CODE_ANALYZER_LWC&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/forcedotcom/code-analyzer&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/forcedotcom/code-analyzer?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/salesforce.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce.md&quot;&gt;&lt;strong&gt;SALESFORCE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_code_analyzer_flow.md&quot;&gt;&lt;strong&gt;code-analyzer-flow&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_code_analyzer_flow.md&quot;&gt;&lt;em&gt;SALESFORCE_CODE_ANALYZER_FLOW&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/forcedotcom/code-analyzer&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/forcedotcom/code-analyzer?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/salesforce.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce.md&quot;&gt;&lt;strong&gt;SALESFORCE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_sfdx_scanner_apex.md&quot;&gt;&lt;strong&gt;sfdx-scanner-apex&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_sfdx_scanner_apex.md&quot;&gt;&lt;em&gt;SALESFORCE_SFDX_SCANNER_APEX&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: sfdx-scanner is incompatible with Node.js 22+ (TypeError: Cannot read properties of undefined (reading &#39;prototype&#39;)). Use SALESFORCE_CODE_ANALYZER_APEX instead.&quot;&gt;🚫&lt;/span&gt; &lt;span title=&quot;Deprecated: sfdx-scanner has been deprecated by Salesforce and will be soon be removed from MegaLinter. Please use SALESFORCE_CODE_ANALYZER_APEX instead.&quot;&gt;⚠️&lt;/span&gt; &lt;a href=&quot;https://github.com/forcedotcom/code-analyzer&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/forcedotcom/code-analyzer?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/salesforce.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce.md&quot;&gt;&lt;strong&gt;SALESFORCE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_sfdx_scanner_aura.md&quot;&gt;&lt;strong&gt;sfdx-scanner-aura&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_sfdx_scanner_aura.md&quot;&gt;&lt;em&gt;SALESFORCE_SFDX_SCANNER_AURA&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: sfdx-scanner is incompatible with Node.js 22+ (TypeError: Cannot read properties of undefined (reading &#39;prototype&#39;)). Use SALESFORCE_CODE_ANALYZER_AURA instead.&quot;&gt;🚫&lt;/span&gt; &lt;span title=&quot;Deprecated: sfdx-scanner has been deprecated by Salesforce and will be soon be removed from MegaLinter. Please use SALESFORCE_CODE_ANALYZER_AURA instead.&quot;&gt;⚠️&lt;/span&gt; &lt;a href=&quot;https://github.com/forcedotcom/code-analyzer&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/forcedotcom/code-analyzer?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/salesforce.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce.md&quot;&gt;&lt;strong&gt;SALESFORCE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_sfdx_scanner_lwc.md&quot;&gt;&lt;strong&gt;sfdx-scanner-lwc&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_sfdx_scanner_lwc.md&quot;&gt;&lt;em&gt;SALESFORCE_SFDX_SCANNER_LWC&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: sfdx-scanner is incompatible with Node.js 22+ (TypeError: Cannot read properties of undefined (reading &#39;prototype&#39;)). Use SALESFORCE_CODE_ANALYZER_LWC instead.&quot;&gt;🚫&lt;/span&gt; &lt;span title=&quot;Deprecated: sfdx-scanner has been deprecated by Salesforce and will be soon be removed from MegaLinter. Please use SALESFORCE_CODE_ANALYZER_LWC instead.&quot;&gt;⚠️&lt;/span&gt; &lt;a href=&quot;https://github.com/forcedotcom/code-analyzer&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/forcedotcom/code-analyzer?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/salesforce.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce.md&quot;&gt;&lt;strong&gt;SALESFORCE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_lightning_flow_scanner.md&quot;&gt;&lt;strong&gt;lightning-flow-scanner&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/salesforce_lightning_flow_scanner.md&quot;&gt;&lt;em&gt;SALESFORCE_LIGHTNING_FLOW_SCANNER&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: Repo archived -&gt; &lt;https://github.com/Lightning-Flow-Scanner&gt;&quot;&gt;🚫&lt;/span&gt; &lt;a href=&quot;https://github.com/Flow-Scanner/lightning-flow-scanner-cli&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/Flow-Scanner/lightning-flow-scanner-cli?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/scala.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/scala.md&quot;&gt;&lt;strong&gt;SCALA&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/scala_scalafix.md&quot;&gt;&lt;strong&gt;scalafix&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/scala_scalafix.md&quot;&gt;&lt;em&gt;SCALA_SCALAFIX&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/scalacenter/scalafix&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/scalacenter/scalafix?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/sql.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/sql.md&quot;&gt;&lt;strong&gt;SQL&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/sql_sqlfluff.md&quot;&gt;&lt;strong&gt;sqlfluff&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/sql_sqlfluff.md&quot;&gt;&lt;em&gt;SQL_SQLFLUFF&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/sqlfluff/sqlfluff&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/sqlfluff/sqlfluff?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/sql.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/sql.md&quot;&gt;&lt;strong&gt;SQL&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/sql_tsqllint.md&quot;&gt;&lt;strong&gt;tsqllint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/sql_tsqllint.md&quot;&gt;&lt;em&gt;SQL_TSQLLINT&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: Upstream unmaintained since 2024-09 (no release/commit in ~22 months); ships unpatched .NET CVEs (CVE-2021-24112 System.Drawing GDI+, CVE-2024-0056 SqlClient, CVE-2023-36414 Azure.Identity) with no prospect of a dependency bump. &lt;https://github.com/tsqllint/tsqllint&gt;&quot;&gt;🚫&lt;/span&gt; &lt;a href=&quot;https://github.com/tsqllint/tsqllint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/tsqllint/tsqllint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/swift.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/swift.md&quot;&gt;&lt;strong&gt;SWIFT&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/swift_swiftlint.md&quot;&gt;&lt;strong&gt;swiftlint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/swift_swiftlint.md&quot;&gt;&lt;em&gt;SWIFT_SWIFTLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/realm/SwiftLint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/realm/SwiftLint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/tsx.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/tsx.md&quot;&gt;&lt;strong&gt;TSX&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/tsx_eslint.md&quot;&gt;&lt;strong&gt;eslint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/tsx_eslint.md&quot;&gt;&lt;em&gt;TSX_ESLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/Rel1cx/eslint-react&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/Rel1cx/eslint-react?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/typescript.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/typescript.md&quot;&gt;&lt;strong&gt;TYPESCRIPT&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/typescript_eslint.md&quot;&gt;&lt;strong&gt;eslint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/typescript_eslint.md&quot;&gt;&lt;em&gt;TYPESCRIPT_ES&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/typescript-eslint/typescript-eslint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/typescript-eslint/typescript-eslint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/typescript.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/typescript.md&quot;&gt;&lt;strong&gt;TYPESCRIPT&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/typescript_ts_standard.md&quot;&gt;&lt;strong&gt;ts-standard&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/typescript_ts_standard.md&quot;&gt;&lt;em&gt;TYPESCRIPT_STANDARD&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/standard/ts-standard&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/standard/ts-standard?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/typescript.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/typescript.md&quot;&gt;&lt;strong&gt;TYPESCRIPT&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/typescript_prettier.md&quot;&gt;&lt;strong&gt;prettier&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/typescript_prettier.md&quot;&gt;&lt;em&gt;TYPESCRIPT_PRETTIER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/prettier/prettier&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/prettier/prettier?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/vbdotnet.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/vbdotnet.md&quot;&gt;&lt;strong&gt;Visual Basic .NET&lt;/strong&gt; (VBDOTNET)&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/vbdotnet_dotnet_format.md&quot;&gt;&lt;strong&gt;dotnet-format&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/vbdotnet_dotnet_format.md&quot;&gt;&lt;em&gt;VBDOTNET_DOTNET_FORMAT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/dotnet/sdk&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/dotnet/sdk?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Formats&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;
    &lt;!-- --&gt;&lt;/th&gt; 
   &lt;th&gt;Format&lt;/th&gt; 
   &lt;th&gt;Linter&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Additional&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/css.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/css.md&quot;&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/css_stylelint.md&quot;&gt;&lt;strong&gt;stylelint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/css_stylelint.md&quot;&gt;&lt;em&gt;CSS_STYLELINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/stylelint/stylelint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/stylelint/stylelint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/env.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/env.md&quot;&gt;&lt;strong&gt;ENV&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/env_dotenv_linter.md&quot;&gt;&lt;strong&gt;dotenv-linter&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/env_dotenv_linter.md&quot;&gt;&lt;em&gt;ENV_DOTENV_LINTER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/dotenv-linter/dotenv-linter&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/dotenv-linter/dotenv-linter?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/graphql.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/graphql.md&quot;&gt;&lt;strong&gt;GRAPHQL&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/graphql_graphql_schema_linter.md&quot;&gt;&lt;strong&gt;graphql-schema-linter&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/graphql_graphql_schema_linter.md&quot;&gt;&lt;em&gt;GRAPHQL_GRAPHQL_SCHEMA_LINTER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/cjoudrey/graphql-schema-linter&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/cjoudrey/graphql-schema-linter?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/html.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/html.md&quot;&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/html_djlint.md&quot;&gt;&lt;strong&gt;djlint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/html_djlint.md&quot;&gt;&lt;em&gt;HTML_DJLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/Riverside-Healthcare/djlint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/Riverside-Healthcare/djlint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/html.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/html.md&quot;&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/html_htmlhint.md&quot;&gt;&lt;strong&gt;htmlhint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/html_htmlhint.md&quot;&gt;&lt;em&gt;HTML_HTMLHINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/htmlhint/HTMLHint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/htmlhint/HTMLHint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/json.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json.md&quot;&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json_jsonlint.md&quot;&gt;&lt;strong&gt;jsonlint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json_jsonlint.md&quot;&gt;&lt;em&gt;JSON_JSONLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/prantlf/jsonlint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/prantlf/jsonlint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/json.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json.md&quot;&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json_eslint_plugin_jsonc.md&quot;&gt;&lt;strong&gt;eslint-plugin-jsonc&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json_eslint_plugin_jsonc.md&quot;&gt;&lt;em&gt;JSON_ESLINT_PLUGIN_JSONC&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: Bug in eslint-plugin-jsonc: &lt;https://github.com/ota-meshi/eslint-plugin-jsonc/issues/328&gt;&quot;&gt;🚫&lt;/span&gt; &lt;span title=&quot;Deprecated: Kept disabled due to a long-standing bug in eslint-plugin-jsonc (&lt;https://github.com/ota-meshi/eslint-plugin-jsonc/issues/328&gt;). Use JSON_PRETTIER or JSON_JSONLINT instead.&quot;&gt;⚠️&lt;/span&gt; &lt;a href=&quot;https://github.com/ota-meshi/eslint-plugin-jsonc&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/ota-meshi/eslint-plugin-jsonc?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/json.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json.md&quot;&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json_v8r.md&quot;&gt;&lt;strong&gt;v8r&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json_v8r.md&quot;&gt;&lt;em&gt;JSON_V8R&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/chris48s/v8r&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/chris48s/v8r?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/json.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json.md&quot;&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json_prettier.md&quot;&gt;&lt;strong&gt;prettier&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json_prettier.md&quot;&gt;&lt;em&gt;JSON_PRETTIER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/prettier/prettier&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/prettier/prettier?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/json.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json.md&quot;&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json_npm_package_json_lint.md&quot;&gt;&lt;strong&gt;npm-package-json-lint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/json_npm_package_json_lint.md&quot;&gt;&lt;em&gt;JSON_NPM_PACKAGE_JSON_LINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/tclindner/npm-package-json-lint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/tclindner/npm-package-json-lint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/latex.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/latex.md&quot;&gt;&lt;strong&gt;LATEX&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/latex_chktex.md&quot;&gt;&lt;strong&gt;chktex&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/latex_chktex.md&quot;&gt;&lt;em&gt;LATEX_CHKTEX&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/markdown.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown.md&quot;&gt;&lt;strong&gt;MARKDOWN&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown_markdownlint.md&quot;&gt;&lt;strong&gt;markdownlint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown_markdownlint.md&quot;&gt;&lt;em&gt;MARKDOWN_MARKDOWNLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/DavidAnson/markdownlint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/DavidAnson/markdownlint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/markdown.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown.md&quot;&gt;&lt;strong&gt;MARKDOWN&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown_remark_lint.md&quot;&gt;&lt;strong&gt;remark-lint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown_remark_lint.md&quot;&gt;&lt;em&gt;MARKDOWN_REMARK_LINT&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: Bug in remark-lint: &lt;https://github.com/remarkjs/remark-lint/issues/322&gt;&quot;&gt;🚫&lt;/span&gt; &lt;a href=&quot;https://github.com/remarkjs/remark-lint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/remarkjs/remark-lint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/markdown.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown.md&quot;&gt;&lt;strong&gt;MARKDOWN&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown_markdown_table_formatter.md&quot;&gt;&lt;strong&gt;markdown-table-formatter&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown_markdown_table_formatter.md&quot;&gt;&lt;em&gt;MARKDOWN_MARKDOWN_TABLE_FORMATTER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/nvuillam/markdown-table-formatter&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/nvuillam/markdown-table-formatter?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/markdown.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown.md&quot;&gt;&lt;strong&gt;MARKDOWN&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown_rumdl.md&quot;&gt;&lt;strong&gt;rumdl&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/markdown_rumdl.md&quot;&gt;&lt;em&gt;MARKDOWN_RUMDL&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/rvben/rumdl&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/rvben/rumdl?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/protobuf.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/protobuf.md&quot;&gt;&lt;strong&gt;PROTOBUF&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/protobuf_protolint.md&quot;&gt;&lt;strong&gt;protolint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/protobuf_protolint.md&quot;&gt;&lt;em&gt;PROTOBUF_PROTOLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/yoheimuta/protolint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/yoheimuta/protolint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/rst.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rst.md&quot;&gt;&lt;strong&gt;RST&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rst_rst_lint.md&quot;&gt;&lt;strong&gt;rst-lint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rst_rst_lint.md&quot;&gt;&lt;em&gt;RST_RST_LINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/twolfson/restructuredtext-lint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/twolfson/restructuredtext-lint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/rst.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rst.md&quot;&gt;&lt;strong&gt;RST&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rst_rstcheck.md&quot;&gt;&lt;strong&gt;rstcheck&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rst_rstcheck.md&quot;&gt;&lt;em&gt;RST_RSTCHECK&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/myint/rstcheck&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/myint/rstcheck?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/rst.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rst.md&quot;&gt;&lt;strong&gt;RST&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rst_rstfmt.md&quot;&gt;&lt;strong&gt;rstfmt&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/rst_rstfmt.md&quot;&gt;&lt;em&gt;RST_RSTFMT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/xml.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/xml.md&quot;&gt;&lt;strong&gt;XML&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/xml_xmllint.md&quot;&gt;&lt;strong&gt;xmllint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/xml_xmllint.md&quot;&gt;&lt;em&gt;XML_XMLLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/yaml.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/yaml.md&quot;&gt;&lt;strong&gt;YAML&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/yaml_prettier.md&quot;&gt;&lt;strong&gt;prettier&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/yaml_prettier.md&quot;&gt;&lt;em&gt;YAML_PRETTIER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/prettier/prettier&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/prettier/prettier?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/yaml.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/yaml.md&quot;&gt;&lt;strong&gt;YAML&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/yaml_yamllint.md&quot;&gt;&lt;strong&gt;yamllint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/yaml_yamllint.md&quot;&gt;&lt;em&gt;YAML_YAMLLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/adrienverge/yamllint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/adrienverge/yamllint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/yaml.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/yaml.md&quot;&gt;&lt;strong&gt;YAML&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/yaml_v8r.md&quot;&gt;&lt;strong&gt;v8r&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/yaml_v8r.md&quot;&gt;&lt;em&gt;YAML_V8R&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/chris48s/v8r&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/chris48s/v8r?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Tooling formats&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;
    &lt;!-- --&gt;&lt;/th&gt; 
   &lt;th&gt;Tooling format&lt;/th&gt; 
   &lt;th&gt;Linter&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Additional&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/action.md&quot;&gt;&lt;strong&gt;ACTION&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/action_actionlint.md&quot;&gt;&lt;strong&gt;actionlint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/action_actionlint.md&quot;&gt;&lt;em&gt;ACTION_ACTIONLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/rhysd/actionlint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/rhysd/actionlint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/action.md&quot;&gt;&lt;strong&gt;ACTION&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/action_zizmor.md&quot;&gt;&lt;strong&gt;zizmor&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/action_zizmor.md&quot;&gt;&lt;em&gt;ACTION_ZIZMOR&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/zizmorcore/zizmor&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/zizmorcore/zizmor?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/ansible.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/ansible.md&quot;&gt;&lt;strong&gt;ANSIBLE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/ansible_ansible_lint.md&quot;&gt;&lt;strong&gt;ansible-lint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/ansible_ansible_lint.md&quot;&gt;&lt;em&gt;ANSIBLE_ANSIBLE_LINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/ansible/ansible-lint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/ansible/ansible-lint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/api.md&quot;&gt;&lt;strong&gt;API&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/api_spectral.md&quot;&gt;&lt;strong&gt;spectral&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/api_spectral.md&quot;&gt;&lt;em&gt;API_SPECTRAL&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: crashing&quot;&gt;🚫&lt;/span&gt; &lt;a href=&quot;https://github.com/stoplightio/spectral&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/stoplightio/spectral?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/arm.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/arm.md&quot;&gt;&lt;strong&gt;ARM&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/arm_arm_ttk.md&quot;&gt;&lt;strong&gt;arm-ttk&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/arm_arm_ttk.md&quot;&gt;&lt;em&gt;ARM_ARM_TTK&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/Azure/arm-ttk&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/Azure/arm-ttk?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bicep.md&quot;&gt;&lt;strong&gt;BICEP&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bicep_bicep_linter.md&quot;&gt;&lt;strong&gt;bicep_linter&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/bicep_bicep_linter.md&quot;&gt;&lt;em&gt;BICEP_BICEP_LINTER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/Azure/bicep&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/Azure/bicep?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/cloudformation.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cloudformation.md&quot;&gt;&lt;strong&gt;CLOUDFORMATION&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cloudformation_cfn_lint.md&quot;&gt;&lt;strong&gt;cfn-lint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/cloudformation_cfn_lint.md&quot;&gt;&lt;em&gt;CLOUDFORMATION_CFN_LINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/aws-cloudformation/cfn-lint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/aws-cloudformation/cfn-lint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/dockerfile.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/dockerfile.md&quot;&gt;&lt;strong&gt;DOCKERFILE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/dockerfile_hadolint.md&quot;&gt;&lt;strong&gt;hadolint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/dockerfile_hadolint.md&quot;&gt;&lt;em&gt;DOCKERFILE_HADOLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/hadolint/hadolint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/hadolint/hadolint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/editorconfig.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/editorconfig.md&quot;&gt;&lt;strong&gt;EDITORCONFIG&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/editorconfig_editorconfig_checker.md&quot;&gt;&lt;strong&gt;editorconfig-checker&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/editorconfig_editorconfig_checker.md&quot;&gt;&lt;em&gt;EDITORCONFIG_EDITORCONFIG_CHECKER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/editorconfig-checker/editorconfig-checker&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/editorconfig-checker/editorconfig-checker?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/gherkin.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/gherkin.md&quot;&gt;&lt;strong&gt;GHERKIN&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/gherkin_gherkin_lint.md&quot;&gt;&lt;strong&gt;gherkin-lint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/gherkin_gherkin_lint.md&quot;&gt;&lt;em&gt;GHERKIN_GHERKIN_LINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/gherkin-lint/gherkin-lint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/gherkin-lint/gherkin-lint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/kubernetes.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kubernetes.md&quot;&gt;&lt;strong&gt;KUBERNETES&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kubernetes_kubeconform.md&quot;&gt;&lt;strong&gt;kubeconform&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kubernetes_kubeconform.md&quot;&gt;&lt;em&gt;KUBERNETES_KUBECONFORM&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/yannh/kubeconform&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/yannh/kubeconform?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/kubernetes.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kubernetes.md&quot;&gt;&lt;strong&gt;KUBERNETES&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kubernetes_helm.md&quot;&gt;&lt;strong&gt;helm&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kubernetes_helm.md&quot;&gt;&lt;em&gt;KUBERNETES_HELM&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/helm/helm&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/helm/helm?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/kubernetes.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kubernetes.md&quot;&gt;&lt;strong&gt;KUBERNETES&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kubernetes_kubescape.md&quot;&gt;&lt;strong&gt;kubescape&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/kubernetes_kubescape.md&quot;&gt;&lt;em&gt;KUBERNETES_KUBESCAPE&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/kubescape/kubescape&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/kubescape/kubescape?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/puppet.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/puppet.md&quot;&gt;&lt;strong&gt;PUPPET&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/puppet_puppet_lint.md&quot;&gt;&lt;strong&gt;puppet-lint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/puppet_puppet_lint.md&quot;&gt;&lt;em&gt;PUPPET_PUPPET_LINT&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: &lt;https://github.com/puppetlabs/puppet-lint/issues/251&gt;&quot;&gt;🚫&lt;/span&gt; &lt;a href=&quot;https://github.com/puppetlabs/puppet-lint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/puppetlabs/puppet-lint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/robotframework.md&quot;&gt;&lt;strong&gt;ROBOTFRAMEWORK&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/robotframework_robocop.md&quot;&gt;&lt;strong&gt;robocop&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/robotframework_robocop.md&quot;&gt;&lt;em&gt;ROBOTFRAMEWORK_ROBOCOP&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/MarketSquare/robotframework-robocop&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/MarketSquare/robotframework-robocop?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/snakemake.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/snakemake.md&quot;&gt;&lt;strong&gt;SNAKEMAKE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/snakemake_snakemake.md&quot;&gt;&lt;strong&gt;snakemake&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/snakemake_snakemake.md&quot;&gt;&lt;em&gt;SNAKEMAKE_LINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/snakemake/snakemake&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/snakemake/snakemake?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/snakemake.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/snakemake.md&quot;&gt;&lt;strong&gt;SNAKEMAKE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/snakemake_snakefmt.md&quot;&gt;&lt;strong&gt;snakefmt&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/snakemake_snakefmt.md&quot;&gt;&lt;em&gt;SNAKEMAKE_SNAKEFMT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/snakemake/snakefmt&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/snakemake/snakefmt?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/tekton.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/tekton.md&quot;&gt;&lt;strong&gt;TEKTON&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/tekton_tekton_lint.md&quot;&gt;&lt;strong&gt;tekton-lint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/tekton_tekton_lint.md&quot;&gt;&lt;em&gt;TEKTON_TEKTON_LINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/IBM/tekton-lint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/IBM/tekton-lint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/terraform.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform.md&quot;&gt;&lt;strong&gt;TERRAFORM&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform_tflint.md&quot;&gt;&lt;strong&gt;tflint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform_tflint.md&quot;&gt;&lt;em&gt;TERRAFORM_TFLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/terraform-linters/tflint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/terraform-linters/tflint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/terraform.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform.md&quot;&gt;&lt;strong&gt;TERRAFORM&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform_terrascan.md&quot;&gt;&lt;strong&gt;terrascan&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform_terrascan.md&quot;&gt;&lt;em&gt;TERRAFORM_TERRASCAN&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: Upstream repo archived by Tenable (unmaintained); ships unpatched CVEs (e.g. CVE-2026-33186 grpc, plus a Go-stdlib tail) with no prospect of a fixed release. &lt;https://github.com/tenable/terrascan&gt;&quot;&gt;🚫&lt;/span&gt; &lt;span title=&quot;Deprecated: Repo archived. &lt;https://github.com/tenable/terrascan&gt;&quot;&gt;⚠️&lt;/span&gt; &lt;a href=&quot;https://github.com/tenable/terrascan&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/tenable/terrascan?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/terraform.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform.md&quot;&gt;&lt;strong&gt;TERRAFORM&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform_terragrunt.md&quot;&gt;&lt;strong&gt;terragrunt&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform_terragrunt.md&quot;&gt;&lt;em&gt;TERRAFORM_TERRAGRUNT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/gruntwork-io/terragrunt&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/gruntwork-io/terragrunt?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/terraform.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform.md&quot;&gt;&lt;strong&gt;TERRAFORM&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform_terraform_fmt.md&quot;&gt;&lt;strong&gt;terraform-fmt&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/terraform_terraform_fmt.md&quot;&gt;&lt;em&gt;TERRAFORM_TERRAFORM_FMT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/hashicorp/terraform&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/hashicorp/terraform?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-format-yellow&quot; alt=&quot;formatter&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Other&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;
    &lt;!-- --&gt;&lt;/th&gt; 
   &lt;th&gt;Code quality checker&lt;/th&gt; 
   &lt;th&gt;Linter&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Additional&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/copypaste.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/copypaste.md&quot;&gt;&lt;strong&gt;COPYPASTE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/copypaste_jscpd.md&quot;&gt;&lt;strong&gt;jscpd&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/copypaste_jscpd.md&quot;&gt;&lt;em&gt;COPYPASTE_JSCPD&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/kucherenko/jscpd&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/kucherenko/jscpd?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_checkov.md&quot;&gt;&lt;strong&gt;checkov&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_checkov.md&quot;&gt;&lt;em&gt;REPOSITORY_CHECKOV&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/bridgecrewio/checkov&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/bridgecrewio/checkov?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_devskim.md&quot;&gt;&lt;strong&gt;devskim&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_devskim.md&quot;&gt;&lt;em&gt;REPOSITORY_DEVSKIM&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/microsoft/DevSkim&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/microsoft/DevSkim?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_dustilock.md&quot;&gt;&lt;strong&gt;dustilock&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_dustilock.md&quot;&gt;&lt;em&gt;REPOSITORY_DUSTILOCK&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/Checkmarx/dustilock&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/Checkmarx/dustilock?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_git_diff.md&quot;&gt;&lt;strong&gt;git_diff&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_git_diff.md&quot;&gt;&lt;em&gt;REPOSITORY_GIT_DIFF&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/git/git&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/git/git?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_gitleaks.md&quot;&gt;&lt;strong&gt;gitleaks&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_gitleaks.md&quot;&gt;&lt;em&gt;REPOSITORY_GITLEAKS&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Deprecated: gitleaks has been superseded by betterleaks, a faster and more accurate secrets scanner created by the same author. Please migrate to REPOSITORY_BETTERLEAKS. Disable gitleaks by adding REPOSITORY_GITLEAKS to DISABLE_LINTERS in your .mega-linter.yml. See &lt;https://github.com/betterleaks/betterleaks&gt;.&quot;&gt;⚠️&lt;/span&gt; &lt;a href=&quot;https://github.com/gitleaks/gitleaks&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/gitleaks/gitleaks?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_betterleaks.md&quot;&gt;&lt;strong&gt;betterleaks&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_betterleaks.md&quot;&gt;&lt;em&gt;REPOSITORY_BETTERLEAKS&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/betterleaks/betterleaks&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/betterleaks/betterleaks?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_grype.md&quot;&gt;&lt;strong&gt;grype&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_grype.md&quot;&gt;&lt;em&gt;REPOSITORY_GRYPE&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/anchore/grype&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/anchore/grype?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;s&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_kics.md&quot;&gt;&lt;strong&gt;kics&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_kics.md&quot;&gt;&lt;em&gt;REPOSITORY_KICS&lt;/em&gt;&lt;/a&gt;&lt;/s&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;span title=&quot;Disabled: Supply chain compromise - &lt;https://socket.dev/blog/checkmarx-supply-chain-compromise&gt;&quot;&gt;🚫&lt;/span&gt; &lt;a href=&quot;https://github.com/checkmarx/kics&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/checkmarx/kics?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_ls_lint.md&quot;&gt;&lt;strong&gt;ls-lint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_ls_lint.md&quot;&gt;&lt;em&gt;REPOSITORY_LS_LINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/loeffel-io/ls-lint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/loeffel-io/ls-lint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_osv_scanner.md&quot;&gt;&lt;strong&gt;osv-scanner&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_osv_scanner.md&quot;&gt;&lt;em&gt;REPOSITORY_OSV_SCANNER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/google/osv-scanner&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/google/osv-scanner?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_secretlint.md&quot;&gt;&lt;strong&gt;secretlint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_secretlint.md&quot;&gt;&lt;em&gt;REPOSITORY_SECRETLINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/secretlint/secretlint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/secretlint/secretlint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_semgrep.md&quot;&gt;&lt;strong&gt;semgrep&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_semgrep.md&quot;&gt;&lt;em&gt;REPOSITORY_SEMGREP&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/returntocorp/semgrep&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/returntocorp/semgrep?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_syft.md&quot;&gt;&lt;strong&gt;syft&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_syft.md&quot;&gt;&lt;em&gt;REPOSITORY_SYFT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/anchore/syft&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/anchore/syft?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_trivy.md&quot;&gt;&lt;strong&gt;trivy&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_trivy.md&quot;&gt;&lt;em&gt;REPOSITORY_TRIVY&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/aquasecurity/trivy&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/aquasecurity/trivy?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_trivy_sbom.md&quot;&gt;&lt;strong&gt;trivy-sbom&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_trivy_sbom.md&quot;&gt;&lt;em&gt;REPOSITORY_TRIVY_SBOM&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/aquasecurity/trivy&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/aquasecurity/trivy?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_trufflehog.md&quot;&gt;&lt;strong&gt;trufflehog&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_trufflehog.md&quot;&gt;&lt;em&gt;REPOSITORY_TRUFFLEHOG&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/trufflesecurity/trufflehog&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/trufflesecurity/trufflehog?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/default.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository.md&quot;&gt;&lt;strong&gt;REPOSITORY&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_kingfisher.md&quot;&gt;&lt;strong&gt;kingfisher&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/repository_kingfisher.md&quot;&gt;&lt;em&gt;REPOSITORY_KINGFISHER&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/mongodb/kingfisher&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/mongodb/kingfisher?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-SARIF-orange&quot; alt=&quot;sarif&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/spell.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell.md&quot;&gt;&lt;strong&gt;SPELL&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell_cspell.md&quot;&gt;&lt;strong&gt;cspell&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell_cspell.md&quot;&gt;&lt;em&gt;SPELL_CSPELL&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/streetsidesoftware/cspell&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/streetsidesoftware/cspell?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/spell.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell.md&quot;&gt;&lt;strong&gt;SPELL&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell_proselint.md&quot;&gt;&lt;strong&gt;proselint&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell_proselint.md&quot;&gt;&lt;em&gt;SPELL_PROSELINT&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/amperser/proselint&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/amperser/proselint?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/spell.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell.md&quot;&gt;&lt;strong&gt;SPELL&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell_vale.md&quot;&gt;&lt;strong&gt;vale&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell_vale.md&quot;&gt;&lt;em&gt;SPELL_VALE&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/errata-ai/vale&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/errata-ai/vale?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/spell.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell.md&quot;&gt;&lt;strong&gt;SPELL&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell_lychee.md&quot;&gt;&lt;strong&gt;lychee&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell_lychee.md&quot;&gt;&lt;em&gt;SPELL_LYCHEE&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/lycheeverse/lychee&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/lycheeverse/lychee?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/spell.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt; 
    &lt;!-- linter-icon --&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell.md&quot;&gt;&lt;strong&gt;SPELL&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell_codespell.md&quot;&gt;&lt;strong&gt;codespell&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/descriptors/spell_codespell.md&quot;&gt;&lt;em&gt;SPELL_CODESPELL&lt;/em&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/codespell-project/codespell&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/codespell-project/codespell?cacheSeconds=3600&quot; alt=&quot;GitHub stars&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://shields.io/badge/-autofix-green&quot; alt=&quot;autofix&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;!-- linters-table-end --&gt; 
&lt;!-- supported-linters-section-end --&gt; 
&lt;!-- installation-section-start --&gt; 
&lt;!-- markdown-headers
---
title: MegaLinter Installation Guide
description: How to install MegaLinter on Github Actions, Gitlab CI, Azure Pipelines, Jenkins, Concourse, Drone CI or to run locally
---
--&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;!-- install-assisted-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Install mega-linter with automated setup
description: Setup MegaLinter in 5 minutes thanks to its assisted installation tool
---
--&gt; 
&lt;h3&gt;Assisted installation&lt;/h3&gt; 
&lt;p&gt;Just run &lt;code&gt;npx mega-linter-runner --install&lt;/code&gt; at the root of your repository and answer questions, it will generate ready to use configuration files for MegaLinter 😃&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/mega-linter-runner-generator.gif?raw=true&quot; alt=&quot;Runner Install&quot; /&gt;&lt;/p&gt; 
&lt;!-- install-assisted-section-end --&gt; 
&lt;!-- install-version-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Selecting a MegaLinter version to use
description: You can use latest release or beta version of MegaLinter, know the differences !
---
--&gt; 
&lt;h3&gt;Which version to use ?&lt;/h3&gt; 
&lt;!-- # MAJOR-RELEASE-IMPACTED --&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Docker registry change (since v9.5.0)&lt;/strong&gt;: MegaLinter Docker images are &lt;strong&gt;published only to GitHub Container Registry (&lt;code&gt;ghcr.io&lt;/code&gt;)&lt;/strong&gt;. The Docker Hub registry (&lt;code&gt;docker.io/oxsecurity/megalinter&lt;/code&gt;, formerly &lt;code&gt;oxsecurity/megalinter:*&lt;/code&gt;) is &lt;strong&gt;frozen at v9.4.0&lt;/strong&gt; until we implement OIDC-based publishing to Docker Hub. If you pull &lt;code&gt;oxsecurity/megalinter:v9&lt;/code&gt; from Docker Hub you will stay on v9.4.0. To get v9.5.0 and later, switch your &lt;code&gt;image:&lt;/code&gt; / &lt;code&gt;docker pull&lt;/code&gt; references to &lt;code&gt;ghcr.io/oxsecurity/megalinter:v9&lt;/code&gt; (same applies to &lt;code&gt;:beta&lt;/code&gt; and all &lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#flavors&quot;&gt;flavor&lt;/a&gt; tags like &lt;code&gt;ghcr.io/oxsecurity/megalinter-python:v9&lt;/code&gt;). GitHub Action users (&lt;code&gt;uses: oxsecurity/megalinter@v9&lt;/code&gt;) are not affected, as the action already pulls from &lt;code&gt;ghcr.io&lt;/code&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;The following instructions examples are using latest MegaLinter stable version (&lt;strong&gt;v9&lt;/strong&gt; , always corresponding to the &lt;a href=&quot;https://github.com/oxsecurity/megalinter/releases&quot;&gt;latest release&lt;/a&gt;)&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Docker image: &lt;code&gt;ghcr.io/oxsecurity/megalinter:v9&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;GitHub Action: &lt;code&gt;oxsecurity/megalinter@v9&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can also use &lt;strong&gt;beta&lt;/strong&gt; version (corresponding to the content of main branch)&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Docker image: &lt;code&gt;ghcr.io/oxsecurity/megalinter:beta&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;GitHub Action: &lt;code&gt;oxsecurity/megalinter@beta&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- install-version-section-end --&gt; 
&lt;!-- install-github-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Install MegaLinter on GitHub Actions
description: Manual instructions to setup MegaLinter in a GitHub Action Workflow 
---
--&gt; 
&lt;h3&gt;GitHub Action&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;Create a new file in your repository called &lt;code&gt;.github/workflows/mega-linter.yml&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Copy the &lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/TEMPLATES/mega-linter.yml&quot;&gt;example workflow from below&lt;/a&gt; into that new file, no extra configuration required&lt;/li&gt; 
 &lt;li&gt;Commit that file to a new branch&lt;/li&gt; 
 &lt;li&gt;Open up a pull request and observe the action working&lt;/li&gt; 
 &lt;li&gt;Enjoy your more &lt;em&gt;stable&lt;/em&gt;, and &lt;em&gt;cleaner&lt;/em&gt; code base&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;strong&gt;NOTES:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;If you pass the &lt;em&gt;Environment&lt;/em&gt; variable &lt;code&gt;GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}&lt;/code&gt; in your workflow, then the &lt;strong&gt;MegaLinter&lt;/strong&gt; will mark the status of each individual linter run in the Checks section of a pull request. Without this you will only see the overall status of the full run. There is no need to set the &lt;strong&gt;GitHub&lt;/strong&gt; Secret as it&#39;s automatically set by GitHub, it only needs to be passed to the action.&lt;/li&gt; 
 &lt;li&gt;You can also &lt;strong&gt;use it outside of GitHub Actions&lt;/strong&gt; (CircleCI, Azure Pipelines, Jenkins, GitLab, or even locally with a docker run) , and have status on Github Pull Request if &lt;code&gt;GITHUB_TARGET_URL&lt;/code&gt; environment variable exists.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;In your repository you should have a &lt;code&gt;.github/workflows&lt;/code&gt; folder with &lt;strong&gt;GitHub&lt;/strong&gt; Action similar to below:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;.github/workflows/mega-linter.yml&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;details&gt; 
 &lt;summary&gt;This file should have this code&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;---
# MegaLinter GitHub Action configuration file
# More info at https://megalinter.io
name: MegaLinter

on:
  # Trigger mega-linter at every push. Action will also be visible from Pull Requests to main
  push: # Comment this line to trigger action only on pull-requests (not recommended if you don&#39;t pay for GH Actions)
  pull_request:
    branches: [master, main]

env: # Comment env block if you don&#39;t want to apply fixes
  # Apply linter fixes configuration
  APPLY_FIXES: all # When active, APPLY_FIXES must also be defined as environment variable (in github/workflows/mega-linter.yml or other CI tool)
  APPLY_FIXES_EVENT: pull_request # Decide which event triggers application of fixes in a commit or a PR (pull_request, push, all)
  APPLY_FIXES_MODE: commit # If APPLY_FIXES is used, defines if the fixes are directly committed (commit) or posted in a PR (pull_request)

concurrency:
  group: ${{ github.ref }}-${{ github.workflow }}
  cancel-in-progress: true

permissions: {}

jobs:
  megalinter:
    name: MegaLinter
    runs-on: ubuntu-latest
    permissions:
      # Give the default GITHUB_TOKEN write permission to commit and push, comment issues &amp;amp; post new PR
      # Remove the ones you do not need
      contents: write
      issues: write
      pull-requests: write
    steps:
      # Git Checkout
      - name: Checkout Code
        uses: actions/checkout@v6
        with:
          # SECURITY NOTE: Using a Personal Access Token (PAT) is NOT
          # recommended. Open-source projects have been heavily targeted by
          # supply-chain attacks in recent months, and a leaked PAT can give
          # attackers broad write access to your repository: better safe
          # than sorry! If you only need workflows to re-trigger after
          # MegaLinter applies fixes, prefer one of these safer alternatives:
          #   - Manually re-run the workflow from the GitHub Actions tab, or
          #   - Push another commit on the branch to trigger workflows again.
          # Only define `secrets.PAT` if you fully understand the trade-off.
          token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}
          persist-credentials: false # Comment this line and uncomment the next one if you use APPLY_FIXES
          # persist-credentials: true # zizmor: ignore[artipacked]
          fetch-depth: 0 # If you use VALIDATE_ALL_CODEBASE = true, you can remove this line to improve performances

      # MegaLinter
      - name: MegaLinter
        id: ml
        # You can override MegaLinter flavor used to have faster performances
        # More info at https://megalinter.io/flavors/
        # MAJOR-RELEASE-IMPACTED
        uses: oxsecurity/megalinter@v9
        env:
          # All available variables are described in documentation
          # https://megalinter.io/configuration/
          VALIDATE_ALL_CODEBASE: ${{ github.event_name == &#39;push&#39; &amp;amp;&amp;amp; github.ref == &#39;refs/heads/main&#39; }} # Validates all source when push on main, else just the git diff with main. Override with true if you always want to lint all sources
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # ADD YOUR CUSTOM ENV VARIABLES HERE OR DEFINE THEM IN A FILE .mega-linter.yml AT THE ROOT OF YOUR REPOSITORY
          # DISABLE: COPYPASTE,SPELL # Uncomment to disable copy-paste and spell checks

      # Upload MegaLinter artifacts
      - name: Archive production artifacts
        if: success() || failure()
        uses: actions/upload-artifact@v7
        with:
          name: MegaLinter reports
          include-hidden-files: &quot;true&quot;
          path: |
            megalinter-reports
            mega-linter.log

      # Create pull request if applicable (for now works only on PR from same repository, not from forks)
      - name: Create Pull Request with applied fixes
        id: cpr
        if: steps.ml.outputs.has_updated_sources == 1 &amp;amp;&amp;amp; (env.APPLY_FIXES_EVENT == &#39;all&#39; || env.APPLY_FIXES_EVENT == github.event_name) &amp;amp;&amp;amp; env.APPLY_FIXES_MODE == &#39;pull_request&#39; &amp;amp;&amp;amp; (github.event_name == &#39;push&#39; || github.event.pull_request.head.repo.full_name == github.repository) &amp;amp;&amp;amp; !contains(github.event.head_commit.message, &#39;skip fix&#39;)
        uses: peter-evans/create-pull-request@v8
        with:
          # SECURITY NOTE: see the warning on the checkout step above —
          # using `secrets.PAT` is NOT recommended for security reasons.
          # Prefer manually re-running the workflow or pushing another
          # commit on the branch to trigger workflows again.
          token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}
          commit-message: &quot;[MegaLinter] Apply linters automatic fixes&quot;
          title: &quot;[MegaLinter] Apply linters automatic fixes&quot;
          labels: bot
      - name: Create PR output
        if: steps.ml.outputs.has_updated_sources == 1 &amp;amp;&amp;amp; (env.APPLY_FIXES_EVENT == &#39;all&#39; || env.APPLY_FIXES_EVENT == github.event_name) &amp;amp;&amp;amp; env.APPLY_FIXES_MODE == &#39;pull_request&#39; &amp;amp;&amp;amp; (github.event_name == &#39;push&#39; || github.event.pull_request.head.repo.full_name == github.repository) &amp;amp;&amp;amp; !contains(github.event.head_commit.message, &#39;skip fix&#39;)
        env:
          PR_NUMBER: ${{ steps.cpr.outputs.pull-request-number }}
          PR_URL: ${{ steps.cpr.outputs.pull-request-url }}
        run: |
          echo &quot;Pull Request Number - ${PR_NUMBER}&quot;
          echo &quot;Pull Request URL - ${PR_URL}&quot;

      # Push new commit if applicable (for now works only on PR from same repository, not from forks)
      - name: Prepare commit
        if: steps.ml.outputs.has_updated_sources == 1 &amp;amp;&amp;amp; (env.APPLY_FIXES_EVENT == &#39;all&#39; || env.APPLY_FIXES_EVENT == github.event_name) &amp;amp;&amp;amp; env.APPLY_FIXES_MODE == &#39;commit&#39; &amp;amp;&amp;amp; github.ref != &#39;refs/heads/main&#39; &amp;amp;&amp;amp; (github.event_name == &#39;push&#39; || github.event.pull_request.head.repo.full_name == github.repository) &amp;amp;&amp;amp; !contains(github.event.head_commit.message, &#39;skip fix&#39;)
        run: sudo chown -Rc $UID .git/
      - name: Commit and push applied linter fixes
        if: steps.ml.outputs.has_updated_sources == 1 &amp;amp;&amp;amp; (env.APPLY_FIXES_EVENT == &#39;all&#39; || env.APPLY_FIXES_EVENT == github.event_name) &amp;amp;&amp;amp; env.APPLY_FIXES_MODE == &#39;commit&#39; &amp;amp;&amp;amp; github.ref != &#39;refs/heads/main&#39; &amp;amp;&amp;amp; (github.event_name == &#39;push&#39; || github.event.pull_request.head.repo.full_name == github.repository) &amp;amp;&amp;amp; !contains(github.event.head_commit.message, &#39;skip fix&#39;)
        uses: stefanzweifel/git-auto-commit-action@v7
        with:
          branch: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }}
          commit_message: &quot;[MegaLinter] Apply linters fixes&quot;
          commit_user_name: megalinter-bot
          commit_user_email: 129584137+megalinter-bot@users.noreply.github.com
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;!-- install-github-section-end --&gt; 
&lt;!-- install-gitlab-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Install MegaLinter on Gitlab CI
description: Manual instructions to setup MegaLinter as a Gitlab Pipeline job
---
--&gt; 
&lt;h3&gt;GitLab CI&lt;/h3&gt; 
&lt;p&gt;Create or update &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file at the root of your repository&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# MegaLinter GitLab CI job configuration file
# More info at https://megalinter.io/

mega-linter:
  stage: test
  # You can override MegaLinter flavor used to have faster performances
  # More info at https://megalinter.io/flavors/
  image: ghcr.io/oxsecurity/megalinter:v9
  script: [ &quot;true&quot; ] # if script: [&quot;true&quot;] doesn&#39;t work, you may try -&amp;gt;  script: [ &quot;/bin/bash /entrypoint.sh&quot; ]
  variables:
    # All available variables are described in documentation
    # https://megalinter.io/configuration/
    DEFAULT_WORKSPACE: $CI_PROJECT_DIR
    # ADD YOUR CUSTOM ENV VARIABLES HERE TO OVERRIDE VALUES OF .mega-linter.yml AT THE ROOT OF YOUR REPOSITORY
  artifacts:
    when: always
    paths:
      - megalinter-reports
    expire_in: 1 week
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Create a Gitlab access token and define it in a variable &lt;strong&gt;GITLAB_ACCESS_TOKEN_MEGALINTER&lt;/strong&gt; in the project CI/CD masked variables. Make sure your token (e.g. if a project token) as the appropriate &lt;a href=&quot;https://docs.gitlab.com/ee/user/permissions.html&quot;&gt;role&lt;/a&gt; for commenting a merge request (at least developer).&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/17500430/151674446-1bcb1420-d9aa-4ae1-aaae-dcf51afb36ab.gif&quot; alt=&quot;config-gitlab-access-token&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/TextReporter_gitlab_1.jpg?raw=true&quot; alt=&quot;Screenshot&quot; /&gt;&lt;/p&gt; 
&lt;!-- install-gitlab-section-end --&gt; 
&lt;!-- install-azure-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Install MegaLinter on Azure Pipelines
description: Manual instructions to setup MegaLinter as an Azure Pipelines job
---
--&gt; 
&lt;h3&gt;Azure Pipelines&lt;/h3&gt; 
&lt;p&gt;Use the following Azure Pipelines &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema&quot;&gt;YAML template&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;You can configure a &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/devops/repos/git/branch-policies?view=azure-devops&amp;amp;tabs=browser#build-validation&quot;&gt;build validation&lt;/a&gt; branch policy against a single repository or across all repositories. If you configure across all repositories then your pipeline is stored in a central repository.&lt;/p&gt; 
&lt;h4&gt;Single Repository&lt;/h4&gt; 
&lt;p&gt;Add the following to an &lt;code&gt;azure-pipelines.yaml&lt;/code&gt; file within your code repository:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;  # Run MegaLinter to detect linting and security issues
  - job: MegaLinter
    pool:
      vmImage: ubuntu-latest
    steps:
      # Checkout repo
      - checkout: self

      # Pull MegaLinter docker image
      - script: docker pull ghcr.io/oxsecurity/megalinter:v9
        displayName: Pull MegaLinter

      # Run MegaLinter
      - script: |
          docker run -v $(System.DefaultWorkingDirectory):/tmp/lint \
            --env-file &amp;lt;(env | grep -e SYSTEM_ -e BUILD_ -e TF_ -e AGENT_) \
            -e SYSTEM_ACCESSTOKEN=$(System.AccessToken) \
            -e GIT_AUTHORIZATION_BEARER=$(System.AccessToken) \
            ghcr.io/oxsecurity/megalinter:v9
        displayName: Run MegaLinter

      # Upload MegaLinter reports
      - task: PublishPipelineArtifact@1
        condition: succeededOrFailed()
        displayName: Upload MegaLinter reports
        inputs:
          targetPath: &quot;$(System.DefaultWorkingDirectory)/megalinter-reports/&quot;
          artifactName: MegaLinterReport
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Central Repository&lt;/h4&gt; 
&lt;p&gt;Add the following to an &lt;code&gt;azure-pipelines.yaml&lt;/code&gt; file within a separate repository, for example a &#39;MegaLinter&#39; repository:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# Run MegaLinter to detect linting and security issues

trigger: none

pool:
  vmImage: ubuntu-latest

variables:
  repoName: $[ replace(split(variables[&#39;System.PullRequest.SourceRepositoryURI&#39;], &#39;/&#39;)[6], &#39;%20&#39;, &#39; &#39;) ]

steps:
  # Checkout triggering repo
  - checkout: git://$(System.TeamProject)/$(repoName)@$(System.PullRequest.SourceBranch)
    displayName: Checkout Triggering Repository

  # Pull MegaLinter docker image
  - script: docker pull ghcr.io/oxsecurity/megalinter:v9
    displayName: Pull MegaLinter

  # Run MegaLinter
  - script: |
      docker run -v $(System.DefaultWorkingDirectory):/tmp/lint \
        --env-file &amp;lt;(env | grep -e SYSTEM_ -e BUILD_ -e TF_ -e AGENT_) \
        -e SYSTEM_ACCESSTOKEN=$(System.AccessToken) \
        -e GIT_AUTHORIZATION_BEARER=$(System.AccessToken) \
        ghcr.io/oxsecurity/megalinter:v9
    displayName: Run MegaLinter

  # Upload MegaLinter reports
  - task: PublishPipelineArtifact@1
    condition: succeededOrFailed()
    displayName: MegaLinter Report
    inputs:
      targetPath: $(System.DefaultWorkingDirectory)/megalinter-reports/
      artifactName: MegaLinterReport
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Pull Request Comments&lt;/h4&gt; 
&lt;p&gt;To enable Pull Request comments, follow the &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/AzureCommentReporter.md&quot;&gt;configuration instructions&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Note: If your pipelines run on Azure DevOps but your source code is hosted on GitHub, and you want status reports to appear on GitHub, you must provide additional repository information to the pipeline. See this &lt;a href=&quot;https://github.com/firedigger/megalinter-azure-pipelines-with-github-repository&quot;&gt;example&lt;/a&gt; for guidance.&lt;/p&gt; 
&lt;h4&gt;Detailed Tutorial&lt;/h4&gt; 
&lt;p&gt;You can also follow this &lt;a href=&quot;https://github.com/DonKoning/megaLinter&quot;&gt;detailed tutorial&lt;/a&gt; by &lt;a href=&quot;https://github.com/DonKoning&quot;&gt;DonKoning&lt;/a&gt;.&lt;/p&gt; 
&lt;h4&gt;Alternative: Azure DevOps Extension (Community)&lt;/h4&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is a community-maintained extension and is &lt;strong&gt;not&lt;/strong&gt; affiliated with or maintained by the MegaLinter team.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;As an alternative to the manual Docker configuration above, the community-maintained &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=DownAtTheBottomOfTheMoleHole.megalinter-ado&quot;&gt;megalinter-ado&lt;/a&gt; Azure DevOps extension provides a native Azure Pipelines task for running MegaLinter.&lt;/p&gt; 
&lt;p&gt;Install from the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=DownAtTheBottomOfTheMoleHole.megalinter-ado&quot;&gt;Visual Studio Marketplace&lt;/a&gt;, then add the task to your pipeline:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;- task: MegaLinter@1
  displayName: Run MegaLinter
  inputs:
    flavor: all
    fix: true
    createFixPR: true
  env:
    SYSTEM_ACCESSTOKEN: $(System.AccessToken)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;See the &lt;a href=&quot;https://github.com/DownAtTheBottomOfTheMoleHole/megalinter-ado&quot;&gt;extension repository&lt;/a&gt; for full configuration options.&lt;/p&gt; 
&lt;!-- install-azure-section-end --&gt; 
&lt;!-- install-bitbucket-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Install MegaLinter on Bitbucket Pipelines
description: Manual instructions to setup MegaLinter as a Bitbucket Pipelines job
---
--&gt; 
&lt;h3&gt;Bitbucket Pipelines&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Create a &lt;code&gt;bitbucket-pipelines.yml&lt;/code&gt; file at the root of your repository.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Copy and paste the following template or add the step to your existing pipeline.&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;image: atlassian/default-image:3
pipelines:
  default:
    - parallel:
      - step:
          name: Run MegaLinter
          image: ghcr.io/oxsecurity/megalinter:v9
          script:
            - export DEFAULT_WORKSPACE=$BITBUCKET_CLONE_DIR &amp;amp;&amp;amp; bash /entrypoint.sh
          artifacts:
            -  megalinter-reports/**
&lt;/code&gt;&lt;/pre&gt; 
&lt;!-- install-bitbucket-section-end --&gt; 
&lt;!-- install-jenkins-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Install MegaLinter on Jenkins
description: Manual instructions to setup MegaLinter as a Jenkins job
---
--&gt; 
&lt;h3&gt;Jenkins&lt;/h3&gt; 
&lt;p&gt;Add the following stage to your Jenkinsfile.&lt;/p&gt; 
&lt;p&gt;You may activate the &lt;a href=&quot;https://megalinter.io/reporters/FileIoReporter/&quot;&gt;File.io reporter&lt;/a&gt; or &lt;a href=&quot;https://megalinter.io/reporters/EmailReporter/&quot;&gt;Email reporter&lt;/a&gt; to access detailed logs and fixed sources.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-groovy&quot;&gt;// Lint with MegaLinter: https://megalinter.io/
stage(&#39;MegaLinter&#39;) {
    agent {
        docker {
            image &#39;ghcr.io/oxsecurity/megalinter:v9&#39;
            args &quot;-u root -e VALIDATE_ALL_CODEBASE=true -v ${WORKSPACE}:/tmp/lint --entrypoint=&#39;&#39;&quot;
            reuseNode true
        }
    }
    steps {
        sh &#39;/entrypoint.sh&#39;
    }
    post {
        always {
            archiveArtifacts allowEmptyArchive: true, artifacts: &#39;mega-linter.log,megalinter-reports/**/*&#39;, defaultExcludes: false, followSymlinks: false
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;CloudBees has a helpful tutorial about how to use MegaLinter with Jenkins!&lt;/p&gt; 
&lt;div style=&quot;text-align:center&quot;&gt;
 &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/KhkNf2tQ3hM&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt; 
&lt;h3&gt;PR Comment Reporting from Jenkins&lt;/h3&gt; 
&lt;p&gt;When MegaLinter runs from a &lt;strong&gt;Jenkins Multibranch Pipeline&lt;/strong&gt;, it can automatically post results as comments on pull requests / merge requests hosted on GitHub, GitLab, Azure DevOps, or Bitbucket.&lt;/p&gt; 
&lt;p&gt;MegaLinter auto-detects the git hosting platform by inspecting the &lt;code&gt;GIT_URL&lt;/code&gt; environment variable (provided by Jenkins Git plugin). It then maps Jenkins environment variables (&lt;code&gt;CHANGE_ID&lt;/code&gt;, &lt;code&gt;GIT_COMMIT&lt;/code&gt;, &lt;code&gt;BUILD_URL&lt;/code&gt;, etc.) to the native CI variables each comment reporter expects.&lt;/p&gt; 
&lt;h4&gt;Requirements&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Jenkins Multibranch Pipeline&lt;/strong&gt; with the appropriate Branch Source plugin (GitHub Branch Source, GitLab Branch Source, or Bitbucket Branch Source)&lt;/li&gt; 
 &lt;li&gt;The pipeline must be triggered by a &lt;strong&gt;pull request / merge request&lt;/strong&gt; (so &lt;code&gt;CHANGE_ID&lt;/code&gt; is set by Jenkins)&lt;/li&gt; 
 &lt;li&gt;An &lt;strong&gt;authentication token&lt;/strong&gt; for the target platform, stored as a Jenkins credential&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Platform Configuration&lt;/h4&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Platform&lt;/th&gt; 
   &lt;th&gt;Required Token Variable&lt;/th&gt; 
   &lt;th&gt;Notes&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;GitHub&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;GITHUB_TOKEN&lt;/code&gt; (recommended) — &lt;code&gt;PAT&lt;/code&gt; only if strictly required&lt;/td&gt; 
   &lt;td&gt;Prefer &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;. Personal Access Tokens (PAT) are &lt;strong&gt;not recommended&lt;/strong&gt; due to recent supply-chain attacks on open-source projects; a leaked PAT can give attackers broad write access to your repository. Token needs &lt;code&gt;repo&lt;/code&gt; scope (or &lt;code&gt;issues:write&lt;/code&gt; + &lt;code&gt;pull-requests:write&lt;/code&gt; for fine-grained tokens).&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;GitLab&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;GITLAB_ACCESS_TOKEN_MEGALINTER&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Personal access token with &lt;code&gt;api&lt;/code&gt; scope&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Azure DevOps&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;SYSTEM_ACCESSTOKEN&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Personal access token with &lt;strong&gt;Code (Read &amp;amp; Write)&lt;/strong&gt; permission&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Bitbucket&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;BITBUCKET_REPO_ACCESS_TOKEN&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Repository access token with &lt;strong&gt;Pull-requests: Write&lt;/strong&gt; scope&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h4&gt;Jenkinsfile Example with GitHub PR Comments&lt;/h4&gt; 
&lt;pre&gt;&lt;code class=&quot;language-groovy&quot;&gt;// Lint with MegaLinter: https://megalinter.io/
stage(&#39;MegaLinter&#39;) {
    agent {
        docker {
            image &#39;ghcr.io/oxsecurity/megalinter:v9&#39;
            args &quot;-u root -e VALIDATE_ALL_CODEBASE=true -v ${WORKSPACE}:/tmp/lint --entrypoint=&#39;&#39;&quot;
            reuseNode true
        }
    }
    environment {
        GITHUB_TOKEN = credentials(&#39;github-token&#39;)
    }
    steps {
        sh &#39;/entrypoint.sh&#39;
    }
    post {
        always {
            archiveArtifacts allowEmptyArchive: true, artifacts: &#39;mega-linter.log,megalinter-reports/**/*&#39;, defaultExcludes: false, followSymlinks: false
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Self-hosted / On-premise Platforms&lt;/h4&gt; 
&lt;p&gt;MegaLinter detects the platform by looking for keywords in the &lt;code&gt;GIT_URL&lt;/code&gt; hostname (e.g., &lt;code&gt;gitlab.mycompany.com&lt;/code&gt; is detected as GitLab, &lt;code&gt;github.internal.corp.com&lt;/code&gt; as GitHub).&lt;/p&gt; 
&lt;p&gt;If your self-hosted instance uses a hostname without the platform name (e.g., &lt;code&gt;git.mycompany.com&lt;/code&gt;), set the &lt;code&gt;JENKINS_REPO_PLATFORM&lt;/code&gt; environment variable to explicitly tell MegaLinter which platform to use:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-groovy&quot;&gt;environment {
    JENKINS_REPO_PLATFORM = &#39;gitlab&#39;  // or &#39;github&#39;, &#39;azure&#39;, &#39;bitbucket&#39;
    GITLAB_ACCESS_TOKEN_MEGALINTER = credentials(&#39;gitlab-token&#39;)
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Additional Variables&lt;/h4&gt; 
&lt;p&gt;For most setups, MegaLinter derives all needed variables automatically. In rare cases, you may need to set additional platform-specific variables:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;GitLab&lt;/strong&gt;: Set &lt;code&gt;CI_PROJECT_ID&lt;/code&gt; if the project path cannot be parsed from &lt;code&gt;GIT_URL&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Azure DevOps&lt;/strong&gt;: Set &lt;code&gt;SYSTEM_ACCESSTOKEN&lt;/code&gt; as a Jenkins credential&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- install-jenkins-section-end --&gt; 
&lt;!-- install-concourse-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Install MegaLinter on Concourse
description: Manual instructions to setup MegaLinter as a Concourse job
---
--&gt; 
&lt;h3&gt;Concourse&lt;/h3&gt; 
&lt;h4&gt;Pipeline step&lt;/h4&gt; 
&lt;p&gt;Use the following job step in your pipeline template.&lt;/p&gt; 
&lt;p&gt;Note: Make sure you have a &lt;code&gt;job.plan.get&lt;/code&gt; step that retrieves the &lt;code&gt;repo&lt;/code&gt; containing your repository, as shown in the example.&lt;/p&gt; 
&lt;!-- # MAJOR-RELEASE-IMPACTED --&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;---

  - name: linting
    plan:
      - get: repo
      - task: linting
        config:
          platform: linux
          image_resource:
            type: docker-image
            source:
              repository: oxsecurity/megalinter
              tag: v9
          inputs:
            - name: repo
          run:
            path: bash
            args:
            - -cxe
            - |
              cd repo
              export DEFAULT_WORKSPACE=$(pwd)
              bash -ex /entrypoint.sh
              ## doing this because concourse doesn&#39;t work as other CI systems
          # params:
            # PARALLEL: true
            # DISABLE: SPELL
            # APPLY_FIXES: all
            # DISABLE_ERRORS: true
            # VALIDATE_ALL_CODEBASE: true
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;OR&lt;/p&gt; 
&lt;h4&gt;Use it as a reusable task&lt;/h4&gt; 
&lt;p&gt;Create a reusable Concourse task that can be used with multiple pipelines.&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Create task file &lt;code&gt;task-linting.yaml&lt;/code&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;!-- # MAJOR-RELEASE-IMPACTED --&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;---
platform: linux
image_resource:
  type: docker-image
  source:
    repository: oxsecurity/megalinter
    tag: v9

inputs:
- name: repo

## uncomment this if you want reports as task output
# output:
# - name: reports
#   path: repo/megalinter-reports

run:
  path: bash
  args:
  - -cxe
  - |
    cd repo
    export DEFAULT_WORKSPACE=$(pwd)
    bash -ex /entrypoint.sh
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li&gt;Use that &lt;code&gt;task-linting.yaml&lt;/code&gt; task in your pipeline.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;Note:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Make sure &lt;code&gt;task-linting.yaml&lt;/code&gt; is available in the &lt;code&gt;repo&lt;/code&gt; input at the repository root.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Task &lt;code&gt;output&lt;/code&gt; is &lt;strong&gt;not&lt;/strong&gt; shown here.&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;resources:

  - name: linting
    plan:
      - get: repo
      - task: linting
        file: repo/task-linting.yaml
        # params:
        #   PARALLEL: true
        #   DISABLE: SPELL
        #   APPLY_FIXES: all
        #   DISABLE_ERRORS: true
        #   VALIDATE_ALL_CODEBASE: true
&lt;/code&gt;&lt;/pre&gt; 
&lt;!-- install-concourse-section-end --&gt; 
&lt;!-- install-drone-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Install MegaLinter on Drone CI
description: Manual instructions to setup MegaLinter as a Drone CI job
---
--&gt; 
&lt;h3&gt;Drone CI&lt;/h3&gt; 
&lt;p&gt;Warning: Drone CI support is experimental and is undergoing significant modifications (see issue &lt;a href=&quot;https://github.com/oxsecurity/megalinter/issues/2047&quot;&gt;#2047&lt;/a&gt;).&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Create a &lt;code&gt;.drone.yml&lt;/code&gt; file on the root directory of your repository&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Copy and paste the following template:&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;kind: pipeline
type: docker
name: MegaLinter

workspace:
  path: /tmp/lint

steps:

- name: megalinter
  image: ghcr.io/oxsecurity/megalinter:v9
  environment:
    DEFAULT_WORKSPACE: /tmp/lint
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This uses the &lt;a href=&quot;https://docs.drone.io/pipeline/docker/overview/&quot;&gt;Drone CI Docker runner&lt;/a&gt;, so you need to install and configure it beforehand on your Drone CI server.&lt;/p&gt; 
&lt;h4&gt;(Optional) Adjusting trigger rules&lt;/h4&gt; 
&lt;p&gt;The Drone CI workflow should trigger automatically for most scenarios (push, pull request, sync…). However, you can optionally change this behavior by modifying the trigger. For example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;kind: pipeline
type: docker
name: MegaLinter

workspace:
  path: /tmp/lint

steps:

- name: megalinter
  image: ghcr.io/oxsecurity/megalinter:v9
  environment:
    DEFAULT_WORKSPACE: /tmp/lint

trigger:
  event:
  - push
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The workflow above triggers only on push, and not in other situations. For more information about configuring Drone CI trigger rules, see the &lt;a href=&quot;https://docs.drone.io/pipeline/triggers/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt; 
&lt;!-- install-drone-section-end --&gt; 
&lt;!-- install-docker-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Run MegaLinter as a Docker image
description: Manual instructions to run MegaLinter as a docker image
---
--&gt; 
&lt;h3&gt;Docker container&lt;/h3&gt; 
&lt;p&gt;You can also run MegaLinter with its Docker container. Execute this command:&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:rw -v $(pwd):/tmp/lint:rw ghcr.io/oxsecurity/megalinter:v9&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;No extra arguments are needed; however, MegaLinter will lint all files inside the &lt;code&gt;/tmp/lint&lt;/code&gt; folder. You may need to configure your tool of choice to use &lt;code&gt;/tmp/lint&lt;/code&gt; as its workspace. This can be changed:&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:rw -v $(pwd):/example/folder:rw ghcr.io/oxsecurity/megalinter:v9&lt;/code&gt;&lt;/p&gt; 
&lt;!-- install-docker-section-end --&gt; 
&lt;!-- install-locally-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Run MegaLinter locally on your computer
description: Manual instructions to run MegaLinter locally on your computer
---
--&gt; 
&lt;h3&gt;Run MegaLinter locally&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://npmjs.org/package/mega-linter-runner&quot;&gt;&lt;img src=&quot;https://img.shields.io/npm/v/mega-linter-runner.svg?sanitize=true&quot; alt=&quot;Version&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://npmjs.org/package/mega-linter-runner&quot;&gt;&lt;img src=&quot;https://img.shields.io/npm/dw/mega-linter-runner.svg?sanitize=true&quot; alt=&quot;Downloads/week&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://npmjs.org/package/mega-linter-runner&quot;&gt;&lt;img src=&quot;https://img.shields.io/npm/dt/mega-linter-runner.svg?sanitize=true&quot; alt=&quot;Downloads/total&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Use &lt;a href=&quot;https://megalinter.io/mega-linter-runner/&quot;&gt;mega-linter-runner&lt;/a&gt; to run MegaLinter locally with the same configuration defined in your &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-file.md&quot;&gt;.mega-linter.yml&lt;/a&gt; file.&lt;/p&gt; 
&lt;p&gt;See the &lt;a href=&quot;https://megalinter.io/mega-linter-runner/#installation&quot;&gt;mega-linter-runner installation instructions&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;npx mega-linter-runner --flavor salesforce -e &quot;&#39;ENABLE=DOCKERFILE,MARKDOWN,YAML&#39;&quot; -e &#39;SHOW_ELAPSED_TIME=true&#39;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Note: You can also use this command line in your custom CI/CD pipelines.&lt;/p&gt; 
&lt;!-- install-locally-section-end --&gt; 
&lt;!-- installation-section-end --&gt; 
&lt;!-- configuration-section-start --&gt; 
&lt;!-- markdown-headers
---
title: MegaLinter configuration Guide
description: List of all configuration variables that can be used to customize the use of MegaLinter (activation, filtering, auto-update, pre-post commands…)
---
--&gt; 
&lt;h2&gt;Configuration&lt;/h2&gt; 
&lt;!-- config-file-section-start --&gt; 
&lt;!-- markdown-headers
---
title: MegaLinter configuration file
description: Use config file with auto-completion to customize MegaLinter behaviour
---
--&gt; 
&lt;h3&gt;.mega-linter.yml file&lt;/h3&gt; 
&lt;p&gt;MegaLinter configuration variables are defined in a &lt;strong&gt;.mega-linter.yml&lt;/strong&gt; file at the root of the repository or with &lt;strong&gt;environment variables&lt;/strong&gt;. You can see an example config file in this repo: &lt;a href=&quot;https://github.com/oxsecurity/megalinter/raw/main/.mega-linter.yml&quot;&gt;&lt;strong&gt;.mega-linter.yml&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Configuration is assisted with autocompletion and validation in most commonly used IDEs, thanks to the &lt;a href=&quot;https://megalinter.io/json-schemas/configuration.html&quot;&gt;JSON schema&lt;/a&gt; stored on &lt;a href=&quot;https://www.schemastore.org/&quot;&gt;schemastore.org&lt;/a&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;VS Code: You need an extension like &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml&quot;&gt;Red Hat YAML&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;IntelliJ IDEA family: Autocompletion is supported natively.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can also define variables as environment variables.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;If a variable exists in both ENV and the &lt;code&gt;.mega-linter.yml&lt;/code&gt; file, priority is given to the ENV variable.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/assisted-configuration.gif&quot; alt=&quot;Assisted configuration&quot; /&gt;&lt;/p&gt; 
&lt;!-- config-file-section-end --&gt; 
&lt;!-- config-variables-section-start --&gt; 
&lt;!-- markdown-headers
---
title: All Megalinter configuration common variables
description: List of common variables that you can use to customize MegaLinter behaviour
---
--&gt; 
&lt;h3&gt;Common variables&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;&lt;strong&gt;ENV VAR&lt;/strong&gt;&lt;/th&gt; 
   &lt;th&gt;&lt;strong&gt;Default Value&lt;/strong&gt;&lt;/th&gt; 
   &lt;th&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;ADDITIONAL_EXCLUDED_DIRECTORIES&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;[]&lt;/td&gt; 
   &lt;td&gt;List of additional excluded directory basenames. They&#39;re excluded at any nested level.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-apply-fixes.md&quot;&gt;&lt;strong&gt;APPLY_FIXES&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;none&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Activates formatting and autofix &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-apply-fixes.md&quot;&gt;(more info)&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;CLEAR_REPORT_FOLDER&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Flag to clear files from report folder (usually megalinter-reports) before starting the linting process&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;CONFIG_PROPERTIES_TO_APPEND&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;[]&lt;/td&gt; 
   &lt;td&gt;List of configuration properties to append their values (instead of replacing them) in case of using EXTENDS.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;DEFAULT_BRANCH&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;HEAD&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;The name of the repository&#39;s default branch, useful if you use VALIDATE_ALL_CODEBASE=false&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;DEFAULT_WORKSPACE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/tmp/lint&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;The location containing files to lint if you are running locally.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;DISABLE_ERRORS&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Flag to have the linter complete with exit code 0 even if errors were detected.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;&lt;strong&gt;DISABLE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
   &lt;td&gt;List of disabled descriptors keys &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;(more info)&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;&lt;strong&gt;DISABLE_LINTERS&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
   &lt;td&gt;List of disabled linters keys &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;(more info)&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;&lt;strong&gt;DISABLE_ERRORS_LINTERS&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
   &lt;td&gt;List of enabled but not blocking linters keys. All linters not in this list will be not blocking &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;(more info)&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;&lt;strong&gt;ENABLE_ERRORS_LINTERS&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
   &lt;td&gt;List of enabled and blocking linters keys &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;(more info)&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;&lt;strong&gt;ENABLE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
   &lt;td&gt;List of enabled descriptors keys &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;(more info)&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;&lt;strong&gt;ENABLE_LINTERS&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
   &lt;td&gt;List of enabled linters keys &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-activation.md&quot;&gt;(more info)&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;EXCLUDED_DIRECTORIES&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;[…many values…]&lt;/td&gt; 
   &lt;td&gt;List of excluded directory basenames. They&#39;re excluded at any nested level.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;EXTENDS&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
   &lt;td&gt;Base &lt;code&gt;mega-linter.yml&lt;/code&gt; config file(s) to extend local configuration from. Can be a single URL or a list of &lt;code&gt;.mega-linter.yml&lt;/code&gt; config files URLs. Later files take precedence.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;FAIL_IF_MISSING_LINTER_IN_FLAVOR&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt;, MegaLinter fails if a linter is missing in the selected flavor&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;FAIL_IF_UPDATED_SOURCES&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt;, MegaLinter fails if a linter or formatter has autofixed sources, even if there are no errors&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-filtering.md&quot;&gt;&lt;strong&gt;FILTER_REGEX_EXCLUDE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;none&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Regular expression defining which files will be excluded from linting &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-filtering.md&quot;&gt;(more info)&lt;/a&gt; .ex: &lt;code&gt;.*src/test.*&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-filtering.md&quot;&gt;&lt;strong&gt;FILTER_REGEX_INCLUDE&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;all&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Regular expression defining which files will be processed by linters &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-filtering.md&quot;&gt;(more info)&lt;/a&gt; .ex: &lt;code&gt;.*src/.*&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;FLAVOR_SUGGESTIONS&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Provides suggestions about different MegaLinter flavors to use to improve runtime performances&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;FORMATTERS_DISABLE_ERRORS&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Formatter errors will be reported as errors (not warnings) if this variable is set to &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;GIT_AUTHORIZATION_BEARER&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
   &lt;td&gt;If set, calls git with &lt;strong&gt;&lt;code&gt;Authorization: Bearer&lt;/code&gt;+value&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;GITHUB_WORKSPACE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
   &lt;td&gt;Base directory for &lt;code&gt;REPORT_OUTPUT_FOLDER&lt;/code&gt;, for user-defined linter rules location, for location of linted files if &lt;code&gt;DEFAULT_WORKSPACE&lt;/code&gt; isn&#39;t set&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;IGNORE_GENERATED_FILES&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt;, MegaLinter will skip files containing &lt;code&gt;@generated&lt;/code&gt; marker but without &lt;code&gt;@not-generated&lt;/code&gt; marker (more info at &lt;a href=&quot;https://generated.at/&quot;&gt;https://generated.at&lt;/a&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;IGNORE_GITIGNORED_FILES&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt;, MegaLinter will skip files ignored by Git using the &lt;code&gt;.gitignore&lt;/code&gt; file.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;JAVASCRIPT_DEFAULT_STYLE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;standard&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Javascript default style to check/apply. &lt;code&gt;standard&lt;/code&gt;,&lt;code&gt;prettier&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;LINTER_RULES_PATH&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.github/linters&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Directory for all linter configuration rules.&lt;br /&gt; Can be a local folder or a remote URL (e.g., &lt;code&gt;https://raw.githubusercontent.com/some_org/some_repo/mega-linter-rules&lt;/code&gt;).&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;LOG_FILE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;mega-linter.log&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;The file name for outputting logs. All output is sent to the log file regardless of &lt;code&gt;LOG_LEVEL&lt;/code&gt;. Use &lt;code&gt;none&lt;/code&gt; to not generate this file.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;LOG_LEVEL&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;INFO&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;How much output the script will generate to the console. One of &lt;code&gt;INFO&lt;/code&gt;, &lt;code&gt;DEBUG&lt;/code&gt;, &lt;code&gt;WARNING&lt;/code&gt; or &lt;code&gt;ERROR&lt;/code&gt;.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;MARKDOWN_DEFAULT_STYLE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;markdownlint&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Markdown default style to check/apply. &lt;code&gt;markdownlint&lt;/code&gt;, &lt;code&gt;remark-lint&lt;/code&gt;, &lt;code&gt;rumdl&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;MEGALINTER_CONFIG&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.mega-linter.yml&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Name of MegaLinter configuration file. Can be defined remotely, in that case set this environment variable with the remote URL of &lt;code&gt;.mega-linter.yml&lt;/code&gt; config file&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;MEGALINTER_FILES_TO_LINT&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;[]&lt;/td&gt; 
   &lt;td&gt;Comma-separated list of files to analyze. Using this variable will bypass other file listing methods&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;PARALLEL&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Process linters in parallel to improve overall MegaLinter performance. If true, linters of same language or formats are grouped in the same parallel process to avoid lock issues if fixing the same files&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;PARALLEL_PROCESS_NUMBER&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
   &lt;td&gt;All available cores are used by default. If there are too many, decrease the number of used cores to enhance performance (example: &lt;code&gt;4&lt;/code&gt;).&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#plugins&quot;&gt;&lt;strong&gt;PLUGINS&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;[]&lt;/td&gt; 
   &lt;td&gt;List of plugin urls to install and run during MegaLinter run&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-postcommands.md&quot;&gt;&lt;strong&gt;POST_COMMANDS&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;[]&lt;/td&gt; 
   &lt;td&gt;Custom bash commands to run after linters&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-precommands.md&quot;&gt;&lt;strong&gt;PRE_COMMANDS&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;[]&lt;/td&gt; 
   &lt;td&gt;Custom bash commands to run before linters&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;PRINT_ALPACA&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Enable printing alpaca image to console&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;PRINT_ALL_FILES&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Display all files analyzed by the linter instead of only the number.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;PYTHON_DEFAULT_STYLE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;black&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Python default style to check/apply. &lt;code&gt;black&lt;/code&gt;,&lt;code&gt;ruff&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;REPORT_OUTPUT_FOLDER&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;${GITHUB_WORKSPACE}/megalinter-reports&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Directory for generating report files. Set to &lt;code&gt;none&lt;/code&gt; to skip generating reports.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-variables-security.md&quot;&gt;&lt;strong&gt;SECURED_ENV_VARIABLES&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;[]&lt;/td&gt; 
   &lt;td&gt;Additional list of secured environment variables to hide when calling linters.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-variables-security.md&quot;&gt;&lt;strong&gt;SECURED_ENV_VARIABLES_DEFAULT&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;MegaLinter &amp;amp; CI platforms sensitive variables&lt;/td&gt; 
   &lt;td&gt;List of secured environment variables to hide when calling linters. &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-variables-security.md&quot;&gt;Default list&lt;/a&gt;. This is not recommended to override this variable, use SECURED_ENV_VARIABLES&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;SHOW_ELAPSED_TIME&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Displays elapsed time in reports&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;SHOW_SKIPPED_LINTERS&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Displays all disabled linters MegaLinter could have run.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;SKIP_CLI_LINT_MODES&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;[]&lt;/td&gt; 
   &lt;td&gt;Comma-separated list of cli_lint_modes. To use if you want to skip linters with some CLI lint modes (ex: &lt;code&gt;file,project&lt;/code&gt;). Available values: &lt;code&gt;file&lt;/code&gt;,&lt;code&gt;cli_lint_mode&lt;/code&gt;,&lt;code&gt;project&lt;/code&gt;.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;SKIP_LINTER_OUTPUT_SANITIZATION&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;By default, MegaLinter sanitizes the output of every external command using Gitleaks public rules.&lt;br /&gt;If you are on a private and secured repo, you can improve performances by setting this variable to &lt;code&gt;true&lt;/code&gt;, but it will mean that if a linter output contains a secret, it will be visible in log files&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;TYPESCRIPT_DEFAULT_STYLE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;standard&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Typescript default style to check/apply. &lt;code&gt;standard&lt;/code&gt;,&lt;code&gt;prettier&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;VALIDATE_ALL_CODEBASE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Will parse the entire repository and find all files to validate across all types. &lt;strong&gt;NOTE:&lt;/strong&gt; When set to &lt;code&gt;false&lt;/code&gt;, only &lt;strong&gt;new&lt;/strong&gt; or &lt;strong&gt;edited&lt;/strong&gt; files will be parsed for validation.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;!-- config-variables-section-end --&gt; 
&lt;!-- config-activation-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Configure activation and deactivation of linters within MegaLinter
description: You can enable, disable, make not blocking, allow a minimum number of errors...
---
--&gt; 
&lt;h3&gt;Activation and deactivation&lt;/h3&gt; 
&lt;p&gt;MegaLinter has all linters enabled by default, but allows enabling or disabling specific ones.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;If &lt;code&gt;ENABLE&lt;/code&gt; isn&#39;t set, all descriptors are activated by default. If set, all linters of listed descriptors are activated by default.&lt;/li&gt; 
 &lt;li&gt;If &lt;code&gt;ENABLE_LINTERS&lt;/code&gt; is set, only the listed linters are processed.&lt;/li&gt; 
 &lt;li&gt;If &lt;code&gt;DISABLE&lt;/code&gt; is set, the linters in the listed descriptors are skipped.&lt;/li&gt; 
 &lt;li&gt;If &lt;code&gt;DISABLE_LINTERS&lt;/code&gt; is set, the listed linters are skipped.&lt;/li&gt; 
 &lt;li&gt;If a linter is in both &lt;code&gt;ENABLE_LINTERS&lt;/code&gt; and &lt;code&gt;DISABLE_LINTERS&lt;/code&gt;, &lt;code&gt;ENABLE_LINTERS&lt;/code&gt; wins by default. Set &lt;code&gt;ENABLE_DISABLE_LINTERS_PRIORITY: DISABLE&lt;/code&gt; to make &lt;code&gt;DISABLE_LINTERS&lt;/code&gt; override &lt;code&gt;ENABLE_LINTERS&lt;/code&gt; instead (useful to trim an inherited &lt;code&gt;ENABLE_LINTERS&lt;/code&gt; list when using &lt;code&gt;EXTENDS&lt;/code&gt;).&lt;/li&gt; 
 &lt;li&gt;If &lt;code&gt;DISABLE_ERRORS_LINTERS&lt;/code&gt; is set, the listed linters will run, but if errors are found, they will be considered non-blocking.&lt;/li&gt; 
 &lt;li&gt;If &lt;code&gt;ENABLE_ERRORS_LINTERS&lt;/code&gt; is set, only the linters in this list will be considered blocking.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Examples:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Run all javascript and groovy linters except STANDARD javascript linter. DevSkim errors will be non-blocking&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;ENABLE: JAVASCRIPT,GROOVY
DISABLE_LINTERS: JAVASCRIPT_STANDARD
DISABLE_ERRORS_LINTERS: REPOSITORY_DEVSKIM
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Run all matching linters but only trivy is blocking&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;ENABLE_ERRORS_LINTERS: REPOSITORY_TRIVY
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Run all linters except PHP linters (PHP_BUILTIN, PHP_PHPCS, PHP_PHPSTAN, PHP_PSALM)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;DISABLE: PHP
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Run all linters except PHP_PHPSTAN and PHP_PSALM linters&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;DISABLE_LINTERS:
  - PHP_PHPSTAN
  - PHP_PSALM
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Inherit a shared &lt;code&gt;ENABLE_LINTERS&lt;/code&gt; list via &lt;code&gt;EXTENDS&lt;/code&gt; but skip one of the inherited linters locally&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;EXTENDS: https://example.com/shared/.mega-linter.yml
ENABLE_DISABLE_LINTERS_PRIORITY: DISABLE
DISABLE_LINTERS:
  - PYTHON_PYLINT
&lt;/code&gt;&lt;/pre&gt; 
&lt;!-- config-activation-section-end --&gt; 
&lt;!-- config-filtering-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Configure filtering of files analyzed by MegaLinter
description: Exclude files from linting
---
--&gt; 
&lt;h3&gt;Filter linted files&lt;/h3&gt; 
&lt;p&gt;If you need to lint only a folder or exclude some files from linting, you can use the optional environment parameters &lt;code&gt;FILTER_REGEX_INCLUDE&lt;/code&gt; and &lt;code&gt;FILTER_REGEX_EXCLUDE&lt;/code&gt;. You can apply filters to a single linter by defining the variables &lt;code&gt;&amp;lt;LINTER_KEY&amp;gt;_FILTER_REGEX_INCLUDE&lt;/code&gt; and &lt;code&gt;&amp;lt;LINTER_KEY&amp;gt;_FILTER_REGEX_EXCLUDE&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Examples:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Lint only src folder: &lt;code&gt;FILTER_REGEX_INCLUDE: (src/)&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Don&#39;t lint files inside test and example folders: &lt;code&gt;FILTER_REGEX_EXCLUDE: (test/|examples/)&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Don&#39;t lint javascript files inside test folder: &lt;code&gt;FILTER_REGEX_EXCLUDE: (test/.*\.js)&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Warning: Not applicable with linters using CLI lint mode &lt;code&gt;project&lt;/code&gt; (&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-cli-lint-mode.md&quot;&gt;see details&lt;/a&gt;).&lt;/p&gt; 
&lt;p&gt;You can also use variable &lt;strong&gt;ADDITIONAL_EXCLUDED_DIRECTORIES&lt;/strong&gt; to add more excluded directories&lt;/p&gt; 
&lt;p&gt;Example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;ADDITIONAL_EXCLUDED_DIRECTORIES:
  - .wireit
  - dist
  - build
  - vendor
&lt;/code&gt;&lt;/pre&gt; 
&lt;!-- config-filtering-section-end --&gt; 
&lt;!-- config-apply-fixes-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Configure auto-fixing of issues by MegaLinter
description: Use MegaLinter to auto apply corrections on your repository files
---
--&gt; 
&lt;h3&gt;Apply fixes&lt;/h3&gt; 
&lt;p&gt;MegaLinter can apply fixes provided by linters. To use this capability, you need three environment variables defined at the top level.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;APPLY_FIXES&lt;/strong&gt;: &lt;code&gt;all&lt;/code&gt; to apply fixes of all linters, or a list of linter keys (ex: &lt;code&gt;JAVASCRIPT_ES&lt;/code&gt;,&lt;code&gt;MARKDOWN_MARKDOWNLINT&lt;/code&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Only for the GitHub Actions workflow file, if you use it:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;APPLY_FIXES_EVENT&lt;/strong&gt;: &lt;code&gt;all&lt;/code&gt;, &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pull_request&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt; &lt;em&gt;(use none in case of use of &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/UpdatedSourcesReporter.md&quot;&gt;Updated sources reporter&lt;/a&gt;)&lt;/em&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;APPLY_FIXES_MODE&lt;/strong&gt;: &lt;code&gt;commit&lt;/code&gt; to create a new commit and push it on the same branch, or &lt;code&gt;pull_request&lt;/code&gt; to create a new PR targeting the branch.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Apply fixes issues&lt;/h4&gt; 
&lt;p&gt;You may see GitHub permission errors, or workflows not running on the new commit.&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Security warning — Personal Access Tokens (PAT) are NOT recommended.&lt;/strong&gt; Open-source projects have been heavily targeted by supply-chain attacks in recent months, and a leaked or compromised PAT can give attackers broad write access to your repository — better safe than sorry! Before adding a &lt;code&gt;PAT&lt;/code&gt; secret, ask yourself if you really need workflows to re-trigger automatically after MegaLinter pushes a fix commit. In most cases the simpler and safer workaround is enough:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Manually re-run the failed workflow&lt;/strong&gt; from the GitHub Actions tab, or&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Push another commit&lt;/strong&gt; on the branch (even an empty one: &lt;code&gt;git commit --allow-empty -m &quot;trigger CI&quot;&lt;/code&gt;) so GitHub re-runs the workflows.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;Only set up a PAT if you fully understand the trade-off. If you do, use a &lt;strong&gt;fine-grained token scoped to a single repository&lt;/strong&gt; with the &lt;strong&gt;minimum required permissions&lt;/strong&gt;, and rotate it regularly.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;To solve these issues, apply one of the following solutions.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Method 1: The most secured (still discouraged — read the warning above) 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-fine-grained-personal-access-token&quot;&gt;Create a Fine-Grained Personal Access Token&lt;/a&gt;, scoped only to your repository and with &lt;strong&gt;Contents: Read/Write&lt;/strong&gt;, then copy the PAT value&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-an-environment&quot;&gt;Define environment secret variable&lt;/a&gt; named &lt;strong&gt;PAT&lt;/strong&gt; on your repository, and paste the PAT value&lt;/li&gt; 
   &lt;li&gt;Update your GitHub Actions workflow to add the environment name&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;-- Method 2: Easier, but &lt;strong&gt;strongly discouraged&lt;/strong&gt; — any contributor with write access can see your Personal Access Token, so use it only on private repositories.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token#creating-a-token&quot;&gt;Create a Classic Personal Access Token&lt;/a&gt;, then copy the PAT value&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/free-pro-team@latest/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository&quot;&gt;Define secret variable&lt;/a&gt; named &lt;strong&gt;PAT&lt;/strong&gt; on your repository, and paste the PAT value&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Notes&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;You can use the &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/UpdatedSourcesReporter.md&quot;&gt;Updated sources reporter&lt;/a&gt; if you don&#39;t want fixes to be automatically applied on the Git branch. Instead, download them in a ZIP file and manually extract them into your project.&lt;/li&gt; 
 &lt;li&gt;If used, &lt;code&gt;APPLY_FIXES_EVENT&lt;/code&gt; and &lt;code&gt;APPLY_FIXES_MODE&lt;/code&gt; cannot be defined in the &lt;code&gt;.mega-linter.yml&lt;/code&gt; config file; they must be set as environment variables.&lt;/li&gt; 
 &lt;li&gt;If you use &lt;code&gt;APPLY_FIXES&lt;/code&gt;, add the following line to your &lt;code&gt;.gitignore&lt;/code&gt; file:&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;megalinter-reports/
&lt;/code&gt;&lt;/pre&gt; 
&lt;!-- config-apply-fixes-section-end --&gt; 
&lt;!-- config-linters-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Linter scoped variables
description: Every linters has its own variables that can be customized
---
--&gt; 
&lt;h3&gt;Linter specific variables&lt;/h3&gt; 
&lt;p&gt;See variables related to a single linter behavior in &lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#supported-linters&quot;&gt;linters documentations&lt;/a&gt;&lt;/p&gt; 
&lt;!-- config-linters-section-end --&gt; 
&lt;!-- config-precommands-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Configure custom commands to run before linters
description: Customize your MegaLinter run by installing linters extensions with npm, pip, or even raw bash before linters are run
---
--&gt; 
&lt;h3&gt;Pre-commands&lt;/h3&gt; 
&lt;p&gt;MegaLinter can run custom commands before running linters (for example, installing a plugin required by one of the linters you use).&lt;/p&gt; 
&lt;p&gt;Example in &lt;code&gt;.mega-linter.yml&lt;/code&gt; config file&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;PRE_COMMANDS:
  - command: npm install eslint-plugin-whatever
    cwd: root        # Will be run at the root of the MegaLinter Docker image
    secured_env: true  # True by default. If set to false, no global variables will be hidden (for example, if you need GITHUB_TOKEN)
    run_before_linters: True # Will be run before the execution of the linters themselves; required for npm/pip commands that cannot be run in parallel
  - command: echo &quot;pre-test command has been called&quot;
    cwd: workspace   # Will be run at the root of the workspace (usually your repository root)
    continue_if_failed: False  # Will stop the process if the command fails (return code &amp;gt; 0)
  - command: pip install flake8-cognitive-complexity
    venv: flake8 # Will be run within the flake8 Python virtualenv. There is one virtualenv per Python-based linter, with the same name
  - command: export MY_OUTPUT_VAR=&quot;my output var&quot; &amp;amp;&amp;amp; export MY_OUTPUT_VAR2=&quot;my output var2&quot;
    output_variables: [&quot;MY_OUTPUT_VAR&quot;,&quot;MY_OUTPUT_VAR2&quot;] # Will collect the values of output variables and update MegaLinter&#39;s own ENV context
  - command: echo &quot;Some command called before loading MegaLinter plugins&quot;
    cwd: workspace   # Will be run at the root of the workspace (usually your repository root)
    continue_if_failed: False  # Will stop the process if the command fails (return code &amp;gt; 0)
    tag: before_plugins # Tag indicating that the command will be run before loading plugins
  - command: echo &quot;Some command called after running MegaLinter linters&quot;
    run_after_linters: True # Will be run after the execution of the linters themselves
&lt;/code&gt;&lt;/pre&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Property&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
   &lt;th&gt;Default value&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;command&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Command line to run&lt;/td&gt; 
   &lt;td&gt;Mandatory&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;cwd&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Directory where to run the command (&lt;code&gt;workspace&lt;/code&gt; or &lt;code&gt;root&lt;/code&gt;)&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;root&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;run_before_linters&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt;, runs the command before the execution of the linters themselves, required for npm/pip commands that cannot be run in parallel&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;run_after_linters&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt;, runs the command after the execution of the linters themselves&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;secured_env&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Apply filtering of secured environment variables before calling the command (default true).&lt;br /&gt;Be careful if you disable it!&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;continue_if_failed&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;If set to &lt;code&gt;false&lt;/code&gt;, stop the MegaLinter process in case of command failure&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;venv&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;If set, runs the command in the related Python venv&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;output_variables&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;ENV variables to read from output after running the commands, and store in MegaLinter&#39;s ENV context so they can be reused in subsequent commands&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;tag&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Tag defining at which command entry point the command will be run (available tags: &lt;code&gt;before_plugins&lt;/code&gt;)&lt;/td&gt; 
   &lt;td&gt;
    &lt;!-- --&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;!-- config-precommands-section-end --&gt; 
&lt;!-- config-postcommands-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Configure custom commands to run after linters
description: Customize your MegaLinter run by running commands after linters are run
---
--&gt; 
&lt;h3&gt;Post-commands&lt;/h3&gt; 
&lt;p&gt;MegaLinter can run custom commands after running linters (for example, running additional tests).&lt;/p&gt; 
&lt;p&gt;Example in &lt;code&gt;.mega-linter.yml&lt;/code&gt; config file&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;POST_COMMANDS:
  - command: npm run test
    cwd: &quot;workspace&quot;   # Will be run at the root of the workspace (usually your repository root)
    continue_if_failed: False  # Will stop the process if the command fails (return code &amp;gt; 0)
&lt;/code&gt;&lt;/pre&gt; 
&lt;!-- config-postcommands-section-end --&gt; 
&lt;!-- config-variables-security-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Configure environment variables security with MegaLinter
description: Hide from linter executables the environment variables that can contain secrets
---
--&gt; 
&lt;h3&gt;Environment variables security&lt;/h3&gt; 
&lt;h4&gt;Secured env variables&lt;/h4&gt; 
&lt;p&gt;MegaLinter runs in a Docker image and calls the linters via the command line to gather their results.&lt;/p&gt; 
&lt;p&gt;If you run it from your &lt;strong&gt;CI/CD pipelines&lt;/strong&gt;, the Docker image may have &lt;strong&gt;access to your environment variables, which can contain secrets&lt;/strong&gt; defined in CI/CD variables.&lt;/p&gt; 
&lt;p&gt;As it can be complicated to fully trust the authors of all open-source linters, &lt;strong&gt;MegaLinter removes variables from the environment used to call linters&lt;/strong&gt;.&lt;/p&gt; 
&lt;p&gt;Thanks to this feature, you only need to &lt;a href=&quot;https://github.com/oxsecurity/megalinter/raw/main/pyproject.toml&quot;&gt;trust MegaLinter and its internal Python dependencies&lt;/a&gt;; there is no need to trust all the linters that are used.&lt;/p&gt; 
&lt;p&gt;You can add secured variables to the default list using the configuration property &lt;code&gt;SECURED_ENV_VARIABLES&lt;/code&gt; in &lt;code&gt;.mega-linter.yml&lt;/code&gt; or as an environment variable (priority is given to ENV variables over the &lt;code&gt;.mega-linter.yml&lt;/code&gt; property).&lt;/p&gt; 
&lt;p&gt;Values can be:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;String (ex: &lt;code&gt;MY_SECRET_VAR&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;Regular Expression (ex: &lt;code&gt;(MY.*VAR)&lt;/code&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Environment variables are secured for each command line called (linters, plugins, SARIF formatter, etc.) except for &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-precommands.md&quot;&gt;PRE_COMMANDS&lt;/a&gt;, and only if you define &lt;code&gt;secured_env: false&lt;/code&gt; in the command.&lt;/p&gt; 
&lt;h4&gt;Secured configuration examples&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;Example of adding extra secured variables in &lt;code&gt;.mega-linter.yml&lt;/code&gt;:&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;SECURED_ENV_VARIABLES:
  - MY_SECRET_TOKEN
  - ANOTHER_VAR_CONTAINING_SENSITIVE_DATA
  - OX_API_KEY
  - (MY.*VAR)  # Regex format
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Example of adding extra secured variables in CI variables, so they cannot be overridden in &lt;code&gt;.mega-linter.yml&lt;/code&gt;:&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;SECURED_ENV_VARIABLES=MY_SECRET_TOKEN,ANOTHER_VAR_CONTAINING_SENSITIVE_DATA,OX_API_KEY
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Default secured variables&lt;/h4&gt; 
&lt;p&gt;If you override &lt;code&gt;SECURED_ENV_VARIABLES_DEFAULT&lt;/code&gt;, it replaces the default list, so it&#39;s better to only define &lt;code&gt;SECURED_ENV_VARIABLES&lt;/code&gt; to add items to the default list.&lt;/p&gt; 
&lt;p&gt;SECURED_ENV_VARIABLES_DEFAULT contains exact names and (regular expressions) matching patterns for commonly used sensitive environment variables:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;PAT&lt;/li&gt; 
 &lt;li&gt;SYSTEM_ACCESSTOKEN&lt;/li&gt; 
 &lt;li&gt;(^|&lt;em&gt;)(USERNAME)($|&lt;/em&gt;)&lt;/li&gt; 
 &lt;li&gt;(^|&lt;em&gt;)(PASSWORD|PASSWD|PASS|PWD)($|&lt;/em&gt;)&lt;/li&gt; 
 &lt;li&gt;(^|&lt;em&gt;)(TOKEN|ID_TOKEN|ACCESS_TOKEN|REFRESH_TOKEN|BEARER)($|&lt;/em&gt;)&lt;/li&gt; 
 &lt;li&gt;(^|&lt;em&gt;)(SECRET|SECRETS)($|&lt;/em&gt;)&lt;/li&gt; 
 &lt;li&gt;(^|&lt;em&gt;)(API_KEY|APP_KEY|CLIENT_ID|CLIENT_SECRET|CLIENT_KEY|SECRET_KEY|ACCESS_KEY|ACCESS_KEY_ID|PRIVATE_KEY|SSH_KEY|SIGNING_KEY|ENCRYPTION_KEY|LICENSE_KEY)($|&lt;/em&gt;)&lt;/li&gt; 
 &lt;li&gt;(^|&lt;em&gt;)(AUTH|AUTHORIZATION)($|&lt;/em&gt;)&lt;/li&gt; 
 &lt;li&gt;(^|&lt;em&gt;)(CERT|CERTIFICATE|CA_BUNDLE|KUBECONFIG)($|&lt;/em&gt;)&lt;/li&gt; 
 &lt;li&gt;(^|&lt;em&gt;)(CONNECTION_STRING|DATABASE_URL|DB_URL|DSN)($|&lt;/em&gt;)&lt;/li&gt; 
 &lt;li&gt;(GOOGLE_APPLICATION_CREDENTIALS)&lt;/li&gt; 
 &lt;li&gt;(GCP_SERVICE_ACCOUNT.*)&lt;/li&gt; 
 &lt;li&gt;(SFDX_CLIENT_ID_.*)&lt;/li&gt; 
 &lt;li&gt;(SFDX_CLIENT_KEY_.*)&lt;/li&gt; 
 &lt;li&gt;(^|_)(SLACK|DISCORD|TEAMS|WEBHOOK)&lt;em&gt;URL($|&lt;/em&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;This compact list is intentionally pattern-based: variables such as &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;, &lt;code&gt;CI_JOB_TOKEN&lt;/code&gt;, &lt;code&gt;NPM_TOKEN&lt;/code&gt;, &lt;code&gt;GIT_AUTHORIZATION_BEARER&lt;/code&gt;, &lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt;, &lt;code&gt;AZURE_CLIENT_SECRET&lt;/code&gt;, &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;, &lt;code&gt;DOCKER_PASSWORD&lt;/code&gt;, and &lt;code&gt;SMTP_PASSWORD&lt;/code&gt; are hidden through these broader matchers.&lt;/p&gt; 
&lt;h4&gt;Security boundaries and threat model&lt;/h4&gt; 
&lt;p&gt;When a linter or plugin command is executed, MegaLinter builds a child-process environment where matched sensitive variables are replaced with &lt;code&gt;HIDDEN_BY_MEGALINTER&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;This means:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;The original value of a matched environment variable is not accessible from that environment variable entry in the child process.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;This does not mean full sandboxing. A malicious dependency can still attempt to collect secrets from other channels, such as:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Unmatched variables (for example after custom overrides of &lt;code&gt;SECURED_ENV_VARIABLES_DEFAULT&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;Variables explicitly unhidden with &lt;code&gt;(linter-key)_UNSECURED_ENV_VARIABLES&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Files mounted in the workspace, command arguments, or generated config files&lt;/li&gt; 
 &lt;li&gt;External credential sources (cloud metadata services, secret managers, network endpoints)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;To maximize protection:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Keep &lt;code&gt;SECURED_ENV_VARIABLES_DEFAULT&lt;/code&gt; unchanged when possible&lt;/li&gt; 
 &lt;li&gt;Add your project-specific patterns with &lt;code&gt;SECURED_ENV_VARIABLES&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Minimize extra credentials exposed to the MegaLinter runtime&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Example (compromised dependency scenario):&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;If a linter dependency (for example &lt;code&gt;axios&lt;/code&gt;) is compromised and executes malicious code, it can read the environment passed to that linter process.&lt;/li&gt; 
 &lt;li&gt;In that environment, matched variables are already replaced by &lt;code&gt;HIDDEN_BY_MEGALINTER&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;So reading &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;, &lt;code&gt;NPM_TOKEN&lt;/code&gt;, &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;, or &lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt; from the process environment returns &lt;code&gt;HIDDEN_BY_MEGALINTER&lt;/code&gt;, not the original secret value.&lt;/li&gt; 
 &lt;li&gt;The same attack could still try to obtain secrets from other channels listed above (files, arguments, external services, etc.).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Unhide variables for linters&lt;/h4&gt; 
&lt;p&gt;You can configure exceptions for a specific linter by defining &lt;code&gt;(linter-key)_UNSECURED_ENV_VARIABLES&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Variable names in this list won&#39;t be hidden from the linter commands.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;TERRAFORM_TFLINT_UNSECURED_ENV_VARIABLES:
  - GITHUB_TOKEN # Can contain string only, not regex
&lt;/code&gt;&lt;/pre&gt; 
&lt;!-- config-variables-security-section-end --&gt; 
&lt;!-- config-cli-lint-mode-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Override the way linters are called by MegaLinter
description: Cli lint mode can be list_of_files, project or files
---
--&gt; 
&lt;h3&gt;CLI lint mode&lt;/h3&gt; 
&lt;p&gt;Each linter is preconfigured to use a default lint mode, which is visible in the MegaLinter documentation (&lt;a href=&quot;https://megalinter.io/latest/descriptors/repository_trivy/#how-the-linting-is-performed&quot;&gt;example&lt;/a&gt;). The possible values are:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;list_of_files&lt;/code&gt;: The linter is called only once, and passed a list of all the files to be processed&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;project&lt;/code&gt;: The linter is called only once, from the root folder of the repository, and it scans for the files to process, as no file names are provided to it&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;file&lt;/code&gt;: The linter is called once per file, which hurts performance&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can override the CLI_LINT_MODE by using a configuration variable for each linter (see the &lt;a href=&quot;https://megalinter.io/supported-linters/&quot;&gt;linters documentation&lt;/a&gt;).&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Linters that default to the &lt;code&gt;file&lt;/code&gt; lint mode cannot be overridden to use the &lt;code&gt;list_of_files&lt;/code&gt; lint mode.&lt;/li&gt; 
 &lt;li&gt;Linters that default to the &lt;code&gt;project&lt;/code&gt; lint mode cannot be overridden to use either the &lt;code&gt;list_of_files&lt;/code&gt; or &lt;code&gt;file&lt;/code&gt; lint modes.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Allowing &lt;code&gt;file&lt;/code&gt; or &lt;code&gt;list_of_files&lt;/code&gt; to be overridden to &lt;code&gt;project&lt;/code&gt; is mostly for workarounds. For example, some linters have a problem finding their config file when the current folder isn&#39;t the repository root.&lt;/p&gt; 
&lt;p&gt;Special considerations:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Linters that are configured to use the &lt;code&gt;project&lt;/code&gt; lint mode ignore variables like &lt;code&gt;FILTER_REGEX_INCLUDE&lt;/code&gt; and &lt;code&gt;FILTER_REGEX_EXCLUDE&lt;/code&gt;, as they are not passed a list of files to lint. For those linters, you must check their documentation to see if a linter can be configured to ignore specific files. For example, the &lt;a href=&quot;https://megalinter.io/latest/descriptors/repository_secretlint/&quot;&gt;Secretlint&lt;/a&gt; linter ignores files listed in &lt;code&gt;~/.secretlintignore&lt;/code&gt; by default, or it can be configured to instead ignore files listed in &lt;code&gt;~/.gitignore&lt;/code&gt; by setting &lt;code&gt;REPOSITORY_SECRETLINT_ARGUMENTS&lt;/code&gt; to &lt;code&gt;--secretlintignore .gitignore.&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- config-cli-lint-mode-section-end --&gt; 
&lt;!-- configuration-section-end --&gt; 
&lt;!-- reporters-section-start --&gt; 
&lt;!-- markdown-headers
---
title: MegaLinter Reporters Guide
description: &quot;List of all available reporters: Text, SARIF, TAP, GitHub, Gitlab, Azure, IDE, File.io, Email, JSON…&quot;
---
--&gt; 
&lt;h2&gt;Reporters&lt;/h2&gt; 
&lt;p&gt;MegaLinter can generate various reports that you can activate or deactivate and customize.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Reporter&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
   &lt;th&gt;Default&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/TextReporter.md&quot;&gt;Text files&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Generates &lt;strong&gt;One log file by linter&lt;/strong&gt; + suggestions for fixes that can not be automated&lt;/td&gt; 
   &lt;td&gt;Active&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/SarifReporter.md&quot;&gt;SARIF (beta)&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Generates an aggregated SARIF output file&lt;/td&gt; 
   &lt;td&gt;Inactive&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/GitHubCommentReporter.md&quot;&gt;GitHub Pull Request comments&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;MegaLinter posts a comment on the PR with a summary of lint results, and links to detailed logs&lt;/td&gt; 
   &lt;td&gt;Active if GitHub Action&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/GitlabCommentReporter.md&quot;&gt;Gitlab Merge Request comments&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Mega-Linter posts a comment on the MR with a summary of lint results, and links to detailed logs&lt;/td&gt; 
   &lt;td&gt;Active if in Gitlab CI&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/AzureCommentReporter.md&quot;&gt;Azure Pipelines Pull Request comments&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Mega-Linter posts a comment on the PR with a summary of lint results, and links to detailed logs&lt;/td&gt; 
   &lt;td&gt;Active if in Azure Pipelines&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/BitbucketCommentReporter.md&quot;&gt;Bitbucket Pull Request comments&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Mega-Linter posts a comment on the PR with a summary of lint results, and links to detailed logs&lt;/td&gt; 
   &lt;td&gt;Active if in Bitbucket CI&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/ApiReporter.md&quot;&gt;API (Grafana)&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Sends logs and metrics to Grafana endpoint (Loki / Prometheus)&lt;/td&gt; 
   &lt;td&gt;Inactive&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/UpdatedSourcesReporter.md&quot;&gt;Updated sources&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Zip containing &lt;strong&gt;all formatted and autofixed sources&lt;/strong&gt; so you can extract them in your repository&lt;/td&gt; 
   &lt;td&gt;Active&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/ConfigReporter.md&quot;&gt;IDE Configuration&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Apply MegaLinter configuration in your local IDE with linter config files and IDE extensions&lt;/td&gt; 
   &lt;td&gt;Active&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/GitHubStatusReporter.md&quot;&gt;GitHub Status&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;One GitHub status by linter on the PR, with links to detailed logs&lt;/td&gt; 
   &lt;td&gt;Active if GitHub Action&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/FileIoReporter.md&quot;&gt;File.io&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Send reports on &lt;a href=&quot;http://file.io&quot;&gt;file.io&lt;/a&gt;&lt;/strong&gt; so you can access them with a simple hyperlink provided at the end of console log&lt;/td&gt; 
   &lt;td&gt;Inactive&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/JsonReporter.md&quot;&gt;JSON&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Generates a JSON output report file&lt;/td&gt; 
   &lt;td&gt;Inactive&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/EmailReporter.md&quot;&gt;Email&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Receive &lt;strong&gt;all reports on your e-mail&lt;/strong&gt;, if you can not use artifacts&lt;/td&gt; 
   &lt;td&gt;Active&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/TapReporter.md&quot;&gt;TAP files&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;One file by linter following &lt;a href=&quot;https://testanything.org/&quot;&gt;&lt;strong&gt;Test Anything Protocol&lt;/strong&gt;&lt;/a&gt; format&lt;/td&gt; 
   &lt;td&gt;Active&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/ConsoleReporter.md&quot;&gt;Console&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Execution logs&lt;/strong&gt; visible in &lt;strong&gt;console&lt;/strong&gt; with &lt;strong&gt;summary table&lt;/strong&gt; and &lt;strong&gt;links to other reports&lt;/strong&gt; at the end&lt;/td&gt; 
   &lt;td&gt;Active&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/MarkdownSummaryReporter.md&quot;&gt;Markdown Summary&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Generates a Markdown summary report file&lt;/td&gt; 
   &lt;td&gt;Inactive&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;!-- reporters-section-end --&gt; 
&lt;!-- flavors-section-start --&gt; 
&lt;!-- markdown-headers
---
title: MegaLinter Flavors for better performances
description: Use one of the numerous MegaLinter flavors to run MegaLinter even faster with only the linters you need
---
--&gt; 
&lt;h2&gt;Flavors&lt;/h2&gt; 
&lt;p&gt;To improve run performance, we provide &lt;strong&gt;flavored MegaLinter images&lt;/strong&gt; containing only the linters related to a project type.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;When using the default MegaLinter, if a MegaLinter flavor would cover all your project requirements, a message is added in the logs.&lt;/li&gt; 
 &lt;li&gt;If your project uses a MegaLinter flavor that doesn&#39;t cover linter requirements, an error message will be thrown with instructions on how to solve the issue.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;The following table doesn&#39;t display docker pulls from &lt;a href=&quot;https://hub.docker.com/r/nvuillam/mega-linter&quot;&gt;MegaLinter v4 &amp;amp; v5 images&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt; 
&lt;!-- flavors-table-start --&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;
    &lt;!-- --&gt;&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Flavor&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Embedded linters&lt;/th&gt; 
   &lt;th style=&quot;text-align:right&quot;&gt;Info&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/mega-linter-square.png&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://megalinter.io/beta/supported-linters/&quot;&gt;all&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Default MegaLinter Flavor&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;125&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/c_cpp.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/c_cpp.md&quot;&gt;c_cpp&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for pure C/C++ projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;60&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-c_cpp/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-c_cpp&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/ci_light.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/ci_light.md&quot;&gt;ci_light&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for CI items (Dockerfile, Jenkinsfile, JSON/YAML schemas,XML&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;24&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-ci_light/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-ci_light&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/cupcake.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/cupcake.md&quot;&gt;cupcake&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;MegaLinter for the most commonly used languages&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;92&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-cupcake/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-cupcake&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/documentation.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/documentation.md&quot;&gt;documentation&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;MegaLinter for documentation projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;53&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-documentation/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-documentation&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/dotnet.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/dotnet.md&quot;&gt;dotnet&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for C, C++, C# or VB based projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;67&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-dotnet/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-dotnet&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/dotnetweb.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/dotnetweb.md&quot;&gt;dotnetweb&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for C, C++, C# or VB based projects with JS/TS&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;76&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-dotnetweb/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-dotnetweb&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/formatters.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/formatters.md&quot;&gt;formatters&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Contains only formatters&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;19&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-formatters/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-formatters&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/go.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/go.md&quot;&gt;go&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for GO based projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;55&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-go/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-go&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/java.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/java.md&quot;&gt;java&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for JAVA based projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;58&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-java/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-java&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/javascript.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/javascript.md&quot;&gt;javascript&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for JAVASCRIPT or TYPESCRIPT based projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;63&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-javascript/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-javascript&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/php.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/php.md&quot;&gt;php&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for PHP based projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;58&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-php/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-php&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/python.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/python.md&quot;&gt;python&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for PYTHON based projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;70&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-python/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-python&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/ruby.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/ruby.md&quot;&gt;ruby&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for RUBY based projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;54&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-ruby/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-ruby&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/rust.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/rust.md&quot;&gt;rust&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for RUST based projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;54&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-rust/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-rust&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/salesforce.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/salesforce.md&quot;&gt;salesforce&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for Salesforce based projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;58&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-salesforce/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-salesforce&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/security.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/security.md&quot;&gt;security&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for security&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;25&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-security/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-security&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/swift.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/swift.md&quot;&gt;swift&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for SWIFT based projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;54&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-swift/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-swift&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/icons/terraform.ico&quot; alt=&quot;&quot; height=&quot;32px&quot; class=&quot;megalinter-icon&quot; /&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/flavors/terraform.md&quot;&gt;terraform&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Optimized for TERRAFORM based projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;56&lt;/td&gt; 
   &lt;td style=&quot;text-align:right&quot;&gt;&lt;img src=&quot;https://img.shields.io/docker/image-size/oxsecurity/megalinter-terraform/beta&quot; alt=&quot;Docker Image Size (tag)&quot; /&gt; &lt;img src=&quot;https://img.shields.io/docker/pulls/oxsecurity/megalinter-terraform&quot; alt=&quot;Docker Pulls&quot; /&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;!-- flavors-table-end --&gt; 
&lt;p&gt;If you need a new flavor, &lt;a href=&quot;https://github.com/oxsecurity/megalinter/issues&quot;&gt;post an issue&lt;/a&gt; 😉&lt;/p&gt; 
&lt;p&gt;You can also generate your own &lt;a href=&quot;https://megalinter.io/beta/custom-flavors/&quot;&gt;custom flavors&lt;/a&gt; to include exactly the linters you need in your MegaLinter Docker image.&lt;/p&gt; 
&lt;!-- flavors-section-end --&gt; 
&lt;!-- badge-section-start --&gt; 
&lt;!-- markdown-headers
---
title: MegaLinter Badges
description: Show that your repositories are cleaned and secured with MegaLinter with a badge
---
--&gt; 
&lt;h2&gt;Badge&lt;/h2&gt; 
&lt;p&gt;You can show the MegaLinter status with a badge in your repository README.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/actions?query=workflow%3AMegaLinter+branch%3Amain&quot;&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/workflows/MegaLinter/badge.svg?branch=main&quot; alt=&quot;MegaLinter&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;If your main branch is named &lt;code&gt;master&lt;/code&gt;, replace &lt;code&gt;main&lt;/code&gt; with &lt;code&gt;master&lt;/code&gt; in the URLs.&lt;/p&gt; 
&lt;h3&gt;Markdown&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Format&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[![MegaLinter](https://github.com/&amp;lt;OWNER&amp;gt;/&amp;lt;REPOSITORY&amp;gt;/workflows/MegaLinter/badge.svg?branch=main)](https://github.com/&amp;lt;OWNER&amp;gt;/&amp;lt;REPOSITORY&amp;gt;/actions?query=workflow%3AMegaLinter+branch%3Amain)
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Example&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[![MegaLinter](https://github.com/nvuillam/npm-groovy-lint/workflows/MegaLinter/badge.svg?branch=main)](https://github.com/nvuillam/npm-groovy-lint/actions?query=workflow%3AMegaLinter+branch%3Amain)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;reStructuredText&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Format&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;.. |MegaLinter yes| image:: https://github.com/&amp;lt;OWNER&amp;gt;/&amp;lt;REPOSITORY&amp;gt;/workflows/MegaLinter/badge.svg?branch=main
   :target: https://github.com/&amp;lt;OWNER&amp;gt;/&amp;lt;REPOSITORY&amp;gt;/actions?query=workflow%3AMegaLinter+branch%3Amain
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Example&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;.. |MegaLinter yes| image:: https://github.com/nvuillam/npm-groovy-lint/workflows/MegaLinter/badge.svg?branch=main
   :target: https://github.com/nvuillam/npm-groovy-lint/actions?query=workflow%3AMegaLinter+branch%3Amain
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; IF you did not use &lt;code&gt;MegaLinter&lt;/code&gt; as GitHub Action name, please read &lt;a href=&quot;https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/monitoring-workflows/adding-a-workflow-status-badge&quot;&gt;GitHub Actions Badges documentation&lt;/a&gt;{target=_blank}&lt;/p&gt; 
&lt;!-- badge-section-end --&gt; 
&lt;!-- plugins-section-start --&gt; 
&lt;!-- markdown-headers
---
title: MegaLinter plugins
description: Build and use your own plugins for MegaLinter, like jupyfmt, nitpick, mustache and linkcheck
---
--&gt; 
&lt;h2&gt;Plugins&lt;/h2&gt; 
&lt;p&gt;For performance and security reasons, we cannot embed every linter in MegaLinter.&lt;/p&gt; 
&lt;p&gt;But our core architecture allows building and publishing MegaLinter plugins!&lt;/p&gt; 
&lt;h3&gt;External Plugins Catalog&lt;/h3&gt; 
&lt;!-- plugins-table-start --&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Name&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Author&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Raw URL&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/kpj/jupyfmt#mega-linter-integration&quot;&gt;&lt;strong&gt;jupyfmt&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;The uncompromising Jupyter notebook formatter&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/kpj&quot;&gt;Kim Philipp Jablonski&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/kpj/jupyfmt/master/mega-linter-plugin-jupyfmt/jupyfmt.megalinter-descriptor.yml&quot;&gt;Descriptor&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/shiranr/linkcheck&quot;&gt;&lt;strong&gt;linkcheck&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Plugin to check and validate markdown links exist and working&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/shiranr&quot;&gt;Shiran Rubin&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/shiranr/linkcheck/main/mega-linter-plugin-linkcheck/linkcheck.megalinter-descriptor.yml&quot;&gt;Descriptor&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/andreoliwa/nitpick#run-as-a-megalinter-plugin&quot;&gt;&lt;strong&gt;nitpick&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Command-line tool and flake8 plugin to enforce the same settings across multiple language-independent projects&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/andreoliwa&quot;&gt;W. Augusto Andreoli&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/andreoliwa/nitpick/master/mega-linter-plugin-nitpick/nitpick.megalinter-descriptor.yml&quot;&gt;Descriptor&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/one-acre-fund/mega-linter-plugin-logstash&quot;&gt;&lt;strong&gt;mustache&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Plugin to validate &lt;a href=&quot;https://www.elastic.co/guide/en/logstash/current/configuration.html&quot;&gt;Logstash&lt;/a&gt; pipeline definition files using &lt;a href=&quot;https://github.com/breml/logstash-config&quot;&gt;mustache&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/Yann-J&quot;&gt;Yann Jouanique&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/one-acre-fund/mega-linter-plugin-logstash/main/mega-linter-plugin-logstash/logstash.megalinter-descriptor.yml&quot;&gt;Descriptor&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/ssc-services/mega-linter-plugin-salt&quot;&gt;&lt;strong&gt;salt-lint&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Checks Salt State files (SLS) for best practices and behavior that could potentially be improved.&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/grimmjo&quot;&gt;Joachim Grimm&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/ssc-services/mega-linter-plugin-salt/main/mega-linter-plugin-salt/salt.megalinter-descriptor.yml&quot;&gt;Descriptor&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean/mega-linter-plugin-dclint/raw/main/README.md&quot;&gt;&lt;strong&gt;docker-compose-linter&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Plugin to lint docker-compose files&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean&quot;&gt;Wesley Dean&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean/mega-linter-plugin-dclint/raw/main/mega-linter-plugin-dclint/dclint.megalinter-descriptor.yml&quot;&gt;Descriptor&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean/mega-linter-plugin-repolinter/raw/main/README.md&quot;&gt;&lt;strong&gt;repolinter&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Plugin to run TODO Group&#39;s repolinter to look for repository best practices&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean&quot;&gt;Wesley Dean&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean/mega-linter-plugin-repolinter/raw/main/mega-linter-plugin-repolinter/repolinter.megalinter-descriptor.yml&quot;&gt;Descriptor&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean/mega-linter-plugin-j2lint/raw/main/README.md&quot;&gt;&lt;strong&gt;j2lint&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Plugin to lint Jinja2 files&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean&quot;&gt;Wesley Dean&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean/mega-linter-plugin-j2lint/raw/main/mega-linter-plugin-j2lint/j2lint.megalinter-descriptor.yml&quot;&gt;Descriptor&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean/mega-linter-plugin-fmlint/raw/main/README.md&quot;&gt;&lt;strong&gt;fmlint&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Plugin to lint YAML frontmatter in Markdown documents&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean&quot;&gt;Wesley Dean&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean/mega-linter-plugin-fmlint/raw/main/mega-linter-plugin-fmlint/fmlint.megalinter-descriptor.yml&quot;&gt;Descriptor&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;!-- plugins-table-end --&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Note: Using an external plugin means you trust its author.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;Submit a Pull Request if you want your plugin to appear here 😃&lt;/p&gt; 
&lt;h3&gt;Use external plugins&lt;/h3&gt; 
&lt;p&gt;Add plugin URLs in the &lt;code&gt;PLUGINS&lt;/code&gt; property of &lt;code&gt;.mega-linter.yml&lt;/code&gt;. URLs must either begin with &quot;https://&quot; or take the form of &quot;file://&amp;lt;path&amp;gt;&quot;, where &amp;lt;path&amp;gt; points to a valid plugin descriptor file.&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Note: Both &amp;lt;path&amp;gt; and the default mount directory (/tmp/lint/&amp;lt;path&amp;gt;) will be checked for a valid descriptor.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h4&gt;Example&lt;/h4&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;PLUGINS:
  - https://raw.githubusercontent.com/kpj/jupyfmt/master/mega-linter-plugin-jupyfmt/jupyfmt.megalinter-descriptor.yml
  - file://.automation/test/mega-linter-plugin-test/test.megalinter-descriptor.yml
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Create your own plugin&lt;/h3&gt; 
&lt;p&gt;You can implement your own descriptors and load them as plugins during MegaLinter runtime.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Descriptor format is exactly the same as &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/megalinter/descriptors&quot;&gt;MegaLinter embedded ones&lt;/a&gt; (&lt;a href=&quot;https://megalinter.io/json-schemas/descriptor.html&quot;&gt;see JSON schema documentation&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;Plugin descriptor files must be named &lt;strong&gt;**.megalinter-descriptor.yml&lt;/strong&gt; and conform to the &lt;a href=&quot;https://github.com/oxsecurity/megalinter/raw/main/megalinter/descriptors/schemas/megalinter-descriptor.jsonschema.json&quot;&gt;MegaLinter JSON Schema&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Plugins must be hosted in a URL containing &lt;strong&gt;**/mega-linter-plugin-**/&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;File URLs must conform to the same directory and file naming criteria as defined above.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Limitations&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;For now, the only &lt;code&gt;install&lt;/code&gt; attributes managed are &lt;code&gt;dockerfile&lt;/code&gt; instructions starting by &lt;code&gt;RUN&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Community Tools&lt;/h3&gt; 
&lt;p&gt;Beyond plugins, the community has built additional tools that integrate with MegaLinter. These are independently maintained and &lt;strong&gt;not&lt;/strong&gt; affiliated with the MegaLinter team.&lt;/p&gt; 
&lt;!-- markdownlint-disable MD060 --&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Name&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Author&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/DownAtTheBottomOfTheMoleHole/megalinter-mcp&quot;&gt;&lt;strong&gt;megalinter-mcp-server&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;An MCP server for running MegaLinter via &lt;a href=&quot;https://megalinter.io/mega-linter-runner/&quot;&gt;mega-linter-runner&lt;/a&gt;. Provides 15 MCP tools for execution, discovery, and analysis. Works with GitHub Copilot Chat in VS Code and other MCP-compatible clients. Available on &lt;a href=&quot;https://www.npmjs.com/package/@downatthebottomofthemolehole/megalinter-mcp-server&quot;&gt;npm&lt;/a&gt;.&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/DownAtTheBottomOfTheMoleHole&quot;&gt;DownAtTheBottomOfTheMoleHole&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/DownAtTheBottomOfTheMoleHole/megalinter-ado&quot;&gt;&lt;strong&gt;megalinter-ado&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Azure DevOps extension providing a native pipeline task for running MegaLinter. Supports flavor selection, auto-fix PRs, and PR comments. Available on the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=DownAtTheBottomOfTheMoleHole.megalinter-ado&quot;&gt;Visual Studio Marketplace&lt;/a&gt;.&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://github.com/DownAtTheBottomOfTheMoleHole&quot;&gt;DownAtTheBottomOfTheMoleHole&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;!-- markdownlint-enable MD060 --&gt; 
&lt;!-- plugins-section-end --&gt; 
&lt;!-- articles-section-start --&gt; 
&lt;!-- markdown-headers
---
title: MegaLinter Articles Reference
description: List of all known articles, blog posts and videos that talk about MegaLinter usage
---
--&gt; 
&lt;h2&gt;They talk about MegaLinter&lt;/h2&gt; 
&lt;!-- /* cspell:disable */ --&gt; 
&lt;h3&gt;English articles&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Article&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Author&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://medium.com/@SeasonedDeveloper/looking-for-the-best-ci-cd-pipeline-linting-tool-try-megalinter-d89c9eba850d&quot;&gt;Looking for the best CI/CD Pipeline Linting Tool? Try MegaLinter!&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://medium.com/@SeasonedDeveloper&quot;&gt;Seasoned Developer&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://medium.com/datamindedbe/integrating-megalinter-to-automate-linting-across-multiple-codebases-a-technical-description-a200bb235b71&quot;&gt;Integrating MegaLinter to Automate Linting Across Multiple Codebases. A Technical Description&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/thorstenfoltz/&quot;&gt;Thorsten Foltz&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://flexion.us/blog/megalinter-performance-tuning/&quot;&gt;MegaLinter Performance Tuning for Maximum Efficiency&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean&quot;&gt;Wes Dean&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://flexion.us/blog/megalinter-tips-and-tricks/&quot;&gt;10 MegaLinter Tips and Tricks Unlock its Full Potential&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean&quot;&gt;Wes Dean&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://medium.com/@caodanju/30-seconds-to-setup-megalinter-your-go-to-tool-for-automated-code-quality-and-iac-security-969d90a5a99c&quot;&gt;30 Seconds to Setup MegaLinter: Your Go-To Tool for Automated Code Quality&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/peng-cao-83b6a2103/&quot;&gt;Peng Cao&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://cloudtuned.hashnode.dev/introducing-megalinter-streamlining-code-quality-checks-across-multiple-languages&quot;&gt;Introducing MegaLinter: Streamlining Code Quality Checks Across Multiple Languages&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://cloudtuned.hashnode.dev/&quot;&gt;Cloud Tuned&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://luke.geek.nz/azure/iac-github-codespace/&quot;&gt;Infrastructure as Code GitHub Codespace Template&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/ljmurray/&quot;&gt;Luke Murray&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://flexion.us/blog/5-ways-megalinter-upped-our-devsecops-game/&quot;&gt;5 ways MegaLinter upped our DevSecOps game&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/wesley-dean&quot;&gt;Wes Dean&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/t5/azure-devops-blog/achieve-code-consistency-megalinter-integration-in-azure-devops/ba-p/3939448&quot;&gt;Achieve Code Consistency: MegaLinter Integration in Azure DevOps&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/t5/user/viewprofilepage/user-id/2039143#profile&quot;&gt;Don Koning&lt;/a&gt;{target=_blank} on &lt;a href=&quot;https://techcommunity.microsoft.com/&quot;&gt;Microsoft Tech Community&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://jamescook.dev/megalinter-in-azure-devops&quot;&gt;MegaLinter in Azure DevOps&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/cookjames/&quot;&gt;James Cook&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://codewithme.cloud/posts/2023/08/maximize-your-code-consistency-with-megalinter/&quot;&gt;Maximize your code consistency with Megalinter&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/torivara/&quot;&gt;Tor Ivar Asbølmo&lt;/a&gt;{target=_blank} on &lt;a href=&quot;https://codewithme.cloud&quot;&gt;codewithme.cloud&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://geekflare.com/nodejs-security-scanner/&quot;&gt;8 Tools to Scan Node.js Applications for Security Vulnerability&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/chandank&quot;&gt;Chandan Kumar&lt;/a&gt;{target=_blank} on &lt;a href=&quot;https://geekflare.com/&quot;&gt;GeekFlare.com&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://cloud.google.com/workflows/docs/use-workflows-json-schema-with-ide&quot;&gt;Use the Workflows JSON schema in your IDE&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://cloud.google.com/&quot;&gt;Google Cloud&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://medium.com/@RunningMattress/level-up-your-unity-packages-with-ci-cd-9498d2791211&quot;&gt;Level up your Unity Packages with CI/CD&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://medium.com/@RunningMattress&quot;&gt;RunningMattress&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://secure-git.guide/013_Sharing-GitHub-secrets-with-third-party-actions&quot;&gt;GitHub Actions: sharing your secrets with third-party actions&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/cgbosse&quot;&gt;Constantin Bosse&lt;/a&gt;{target=_blank} and &lt;a href=&quot;https://github.com/hosom&quot;&gt;Stephen Hosom&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.slideshare.net/SimonedeGijt/pluginandplayv4amsterdamjugpptx-251796070&quot;&gt;Talk about the Kotlin plugins Kover, Ktlint and Detekt. Made for the AmsterdamJUG meetup.&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/SimonedeGijt&quot;&gt;Simone de Gijt&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://rse.shef.ac.uk/blog/2022-04-19-linting/&quot;&gt;Linting - What is all the fluff about?&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/neil-shephard-a43a83211/?originalSubdomain=uk&quot;&gt;Neil Shepard&lt;/a&gt;{target=_blank}, University Of Sheffield&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://dev.to/minwi/how-to-apply-security-at-the-source-using-gitops-21bk&quot;&gt;How to apply security at the source using GitOps&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://dev.to/minwi&quot;&gt;Edu Minguez&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://nklya.medium.com/hot-to-linter-basic-things-like-trailing-whitespaces-and-newlines-7b40da8f688d&quot;&gt;How to linter basic things like trailing whitespaces and newlines&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://nklya.medium.com/&quot;&gt;Nicolai Antiferov&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://javascript.plainenglish.io/node-js-coding-standard-tools-with-megalinter-on-gitlab-ci-a43b55915811&quot;&gt;Node.js Coding Standard Tools with MegaLinter on Gitlab CI&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/albion-bame/&quot;&gt;Albion Bame&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.ayyjohn.com/posts/linting-a-jekyll-blog-with-mega-linter&quot;&gt;Linting a Jekyll blog with MegaLinter&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/ayyjohn/&quot;&gt;Alec Johnson&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://nicolas.vuillamy.fr/megalinter-sells-his-soul-and-joins-ox-security-2a91a0027628&quot;&gt;MegaLinter sells his soul and joins OX Security&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://nvuillam.github.io&quot;&gt;Nicolas Vuillamy&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://nicolas.vuillamy.fr/improve-uniformize-and-secure-your-code-base-with-megalinter-62ebab422c1&quot;&gt;Limit your technical debt and secure your code base using MegaLinter&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://nvuillam.github.io&quot;&gt;Nicolas Vuillamy&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;French articles&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Article&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Author&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://blog.stephane-robert.info/docs/developper/autres-outils/linters/megalinter/&quot;&gt;MegaLinter&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/stephanerobert1/&quot;&gt;Stéphane Robert&lt;/a&gt;, &lt;a href=&quot;https://fr.outscale.com/&quot;&gt;3DS OutScale&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://blog.wescale.fr/megalinter-un-linter-pour-les-gouverner-tous&quot;&gt;MegaLinter: un linter pour les gouverner tous&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/guillaume-arnaud/&quot;&gt;Guillaume Arnaud&lt;/a&gt;, &lt;a href=&quot;https://www.wescale.fr/&quot;&gt;WeScale&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.neosoft.fr/nos-publications/blog-tech/mega-linter-votre-meilleur-ami-pour-un-code-de-qualite/?utm_source=twitter&amp;amp;utm_medium=organic&amp;amp;utm_campaign=article-mega-linter&quot;&gt;MegaLinter, votre meilleur ami pour un code de qualité&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/ThomasSanson&quot;&gt;Thomas Sanson&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Japanese articles&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Article&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Author&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://future-architect.github.io/articles/20231129a/?s=03&quot;&gt;Try using MegaLinter&lt;/a&gt;{target=_blank}&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://future-architect.github.io/authors/%E5%AE%AE%E6%B0%B8%E5%B4%87%E5%8F%B2&quot;&gt;Takashi Minayaga&lt;/a&gt;{target=_blank}&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Videos&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0JGusPYE4zc&quot;&gt;(Brazilian) Qualidade e Segurança em Código com MegaLinter: automatizando análises em MAUI com GitHub Actions&lt;/a&gt;, by &lt;a href=&quot;https://www.youtube.com/@CanaldotNET&quot;&gt;Canal dotNET&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;div style=&quot;text-align:center&quot;&gt;
 &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/0JGusPYE4zc&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=YSdZ3atC2j4&quot;&gt;(Brazilian) MegaLinter: Como Automatizar a Qualidade do Código para Todas Plataformas&lt;/a&gt;, by &lt;a href=&quot;https://www.youtube.com/@hackitectsplayground&quot;&gt;Codando TV&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;div style=&quot;text-align:center&quot;&gt;
 &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/YSdZ3atC2j4&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://youtu.be/iBMWAk5QIfM?si=EVcJilkz7Y2jdn6e&amp;amp;t=649&quot;&gt;How to: Secrets scanning&lt;/a&gt;, by &lt;a href=&quot;https://www.youtube.com/@hackitectsplayground&quot;&gt;Hackitect&#39;s playground&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;div style=&quot;text-align:center&quot;&gt;
 &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/iBMWAk5QIfM&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=KhkNf2tQ3hM&quot;&gt;How to use MegaLinter with Jenkins&lt;/a&gt;, by &lt;a href=&quot;https://www.linkedin.com/in/darinpope/&quot;&gt;Darin Pope&lt;/a&gt; / &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;Cloudbees&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;div style=&quot;text-align:center&quot;&gt;
 &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/KhkNf2tQ3hM&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt; 
&lt;ul&gt; 
 &lt;li&gt;(FR) MegaLinter presentation at &lt;a href=&quot;https://www.programmez.com/page-devcon/devcon-20-100-securite-qualite-du-code&quot;&gt;DevCon 20 / Programmez Magazine&lt;/a&gt;, by &lt;a href=&quot;https://github.com/nvuillam&quot;&gt;Nicolas Vuillamy&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;div style=&quot;text-align:center&quot;&gt;
 &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/SlKurrIsUls&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt; 
&lt;ul&gt; 
 &lt;li&gt;Code quality - Ep01 - MegaLinter, one linter to rule them all, by &lt;a href=&quot;https://github.com/devpro&quot;&gt;Bertrand Thomas&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;div style=&quot;text-align:center&quot;&gt;
 &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/NauVD4z-cMA&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt; 
&lt;ul&gt; 
 &lt;li&gt;DevSecOps Webinar using MegaLinter, by &lt;a href=&quot;https://www.515tech.com/&quot;&gt;5.15 Technologies&lt;/a&gt;{target=_blank}&lt;/li&gt; 
&lt;/ul&gt; 
&lt;div style=&quot;text-align:center&quot;&gt;
 &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/hk950RUwIUA&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt; 
&lt;ul&gt; 
 &lt;li&gt;Ortelius Architecture Meeting, with a review of MegaLinter, by &lt;a href=&quot;https://github.com/sbtaylor15&quot;&gt;Steve Taylor&lt;/a&gt;{target=_blank} from &lt;a href=&quot;https://ortelius.io/&quot;&gt;Ortelius&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;div style=&quot;text-align:center&quot;&gt;
 &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/oegOSmVegiQ?start=1510&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt; 
&lt;h3&gt;Web Sites&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://analysis-tools.dev/tool/mega-linter&quot;&gt;analysis-tools.dev&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/caramelomartins/awesome-linters#language-agnostic&quot;&gt;awesome-linters&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.schemastore.org/&quot;&gt;schemastore.org&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.abhith.net/recommended/&quot;&gt;abhith.net&lt;/a&gt;{target=_blank}&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- - [iac-analyzers.dev/](https://iac-analyzers.dev/){target=_blank} --&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.my-devops-lab.com/tools&quot;&gt;my-devops-lab.com&lt;/a&gt;{target=_blank}&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Linters&lt;/h3&gt; 
&lt;!-- referring-linters-start --&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/checkmake/checkmake?tab=readme-ov-file#megalinter&quot;&gt;checkmake&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://checkstyle.org/index.html#Related_Tools_Active_Tools&quot;&gt;checkstyle&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/borkdude/clj-kondo/raw/master/doc/ci-integration.md#github&quot;&gt;clj-kondo&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/greglook/cljstyle/raw/main/doc/integrations.md&quot;&gt;cljstyle&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/streetsidesoftware/cspell/tree/master/packages/cspell#mega-linter&quot;&gt;cspell&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://detekt.dev/docs/intro&quot;&gt;detekt&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://djlint.com/docs/integrations/#megalinter&quot;&gt;djlint&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://dotenv-linter.github.io/#/integrations/mega_linter&quot;&gt;dotenv-linter&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/editorconfig-checker/editorconfig-checker#mega-linter&quot;&gt;editorconfig-checker&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://eslint.org/docs/latest/use/integrations#source-control&quot;&gt;eslint&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://eslint.org/docs/latest/use/integrations#source-control&quot;&gt;eslint-plugin-jsonc&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/hadolint/hadolint/raw/master/docs/INTEGRATION.md#mega-linter&quot;&gt;hadolint&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://htmlhint.com/integrations/task-runner/&quot;&gt;htmlhint&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/kucherenko/jscpd#who-uses-jscpd&quot;&gt;jscpd&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.kics.io/latest/integrations/&quot;&gt;kics&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/pinterest/ktlint#-with-continuous-integration&quot;&gt;ktlint&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://lintr.r-lib.org/articles/continuous-integration.html&quot;&gt;lintr&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://nvuillam.github.io/npm-groovy-lint/#mega-linter&quot;&gt;npm-groovy-lint&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://npmpackagejsonlint.org/docs/integrations#megalinter&quot;&gt;npm-package-json-lint&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://pmd.sourceforge.io/pmd-6.55.0/pmd_userdocs_tools_ci.html&quot;&gt;pmd&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/twolfson/restructuredtext-lint/wiki/Integration-in-other-tools#integration-in-other-tools&quot;&gt;rst-lint&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://rstcheck.readthedocs.io/en/latest/usage/integration/#use-with-mega-linter&quot;&gt;rstcheck&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.rubocop.org/rubocop/integration_with_other_tools.html#mega-linter-integration&quot;&gt;rubocop&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://scalacenter.github.io/scalafix/docs/users/installation.html#plugins-for-other-build-tools&quot;&gt;scalafix&lt;/a&gt;{target=_blank}&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/secretlint/secretlint#mega-linter&quot;&gt;secretlint&lt;/a&gt;{target=_blank}&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- referring-linters-end --&gt; 
&lt;!-- /* cspell:enable */ --&gt; 
&lt;!-- articles-section-end --&gt; 
&lt;!-- frequently-asked-questions-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Frequently Asked Questions about MegaLinter
description: List of recurrent questions about MegaLinter
---
--&gt; 
&lt;h2&gt;Frequently Asked Questions&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;My repo CI already has linters and they&#39;re working perfectly, so why do I need MegaLinter?&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;You can continue using your installed linters and deactivate them in &lt;code&gt;.mega-linter.yml&lt;/code&gt;. For example, in a JavaScript project using ESLint, configure MegaLinter with &lt;code&gt;DISABLE: JAVASCRIPT&lt;/code&gt;. That way, you will benefit from both your installed linters and other MegaLinter linters checking JSON, YAML, Markdown, Dockerfile, Bash, spelling mistakes, dead URLs…&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;OK but… how does it work?&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;MegaLinter is based on Docker images containing either all linters, or a selection of linters if you use a MegaLinter flavor for a project with a specific language or format.&lt;/p&gt; 
&lt;p&gt;The core architecture does the following:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;strong&gt;List all project files&lt;/strong&gt;: 
    &lt;ul&gt; 
     &lt;li&gt;except files in ignored folders (&lt;code&gt;node_modules&lt;/code&gt;, etc…)&lt;/li&gt; 
     &lt;li&gt;except files not matching &lt;code&gt;FILTER_REGEX_INCLUDE&lt;/code&gt; (if defined by user)&lt;/li&gt; 
     &lt;li&gt;except files matching &lt;code&gt;FILTER_REGEX_EXCLUDE&lt;/code&gt; (if defined by user)&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;strong&gt;Collect files for each activated linter&lt;/strong&gt;, matching their &lt;strong&gt;own filtering criteria&lt;/strong&gt;: 
    &lt;ul&gt; 
     &lt;li&gt;file extensions&lt;/li&gt; 
     &lt;li&gt;file names&lt;/li&gt; 
     &lt;li&gt;file content&lt;/li&gt; 
     &lt;li&gt;&lt;code&gt;&amp;lt;descriptor_or_linter_key&amp;gt;_FILTER_REGEX_INCLUDE&lt;/code&gt; (if defined by user)&lt;/li&gt; 
     &lt;li&gt;&lt;code&gt;&amp;lt;descriptor_or_linter_key&amp;gt;_FILTER_REGEX_EXCLUDE&lt;/code&gt; (if defined by user)&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Linting&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;strong&gt;Parallelly&lt;/strong&gt;, for &lt;strong&gt;each linter&lt;/strong&gt; with matching files: 
    &lt;ul&gt; 
     &lt;li&gt;&lt;strong&gt;Call the linter&lt;/strong&gt; on matching files (or the whole project for some linters like copy-paste detector)&lt;/li&gt; 
     &lt;li&gt;Call activated &lt;strong&gt;linter-level reporters&lt;/strong&gt; (GitHub Status Reporter…)&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Finalization&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;Call activated &lt;strong&gt;global level reporters&lt;/strong&gt; (GitHub Pull Request Comment Reporter, &lt;a href=&quot;http://File.io&quot;&gt;File.io&lt;/a&gt; Reporter, Email Reporter…)&lt;/li&gt; 
   &lt;li&gt;Manage return code: 
    &lt;ul&gt; 
     &lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; if no error (or only non blocking errors if user defined &lt;code&gt;DISABLE_ERRORS&lt;/code&gt; or &lt;code&gt;&amp;lt;descriptor_or_linter_key&amp;gt;_DISABLE_ERRORS&lt;/code&gt;)&lt;/li&gt; 
     &lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; if errors&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- frequently-asked-questions-section-end --&gt; 
&lt;!-- how-to-contribute-section-start --&gt; 
&lt;!-- markdown-headers
---
title: MegaLinter Contributing Guide
description: Help MegaLinter by starring the repo, post issues and Pull Requests, or even sponsor the author
---
--&gt; 
&lt;h2&gt;How to contribute&lt;/h2&gt; 
&lt;p&gt;Contributions to MegaLinter are very welcome: the more we are, the stronger MegaLinter becomes! Please follow &lt;a href=&quot;https://megalinter.io/contributing/&quot;&gt;Contributing Guide&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;To help, you can also:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/stargazers&quot;&gt;⭐ Star the repository&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/sponsors/nvuillam&quot;&gt;🍺 Offer a beer!&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/issues&quot;&gt;report problems and request new features&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://twitter.com/intent/tweet/?text=MegaLinter:%2070%20linters%20aggregator%20easy%20to%20use%20for%20all%20your%20projects&amp;amp;url=http://megalinter.io/&amp;amp;via=nvuillam&quot;&gt;share on twitter&lt;/a&gt;{target=_blank}&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- how-to-contribute-section-end --&gt; 
&lt;!-- special-thanks-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Special Thanks from MegaLinter
description: List of all contributors, websites and linters that help MegaLinter to grow and be better everyday
---
--&gt; 
&lt;h2&gt;Special thanks&lt;/h2&gt; 
&lt;h3&gt;Maintainers&lt;/h3&gt; 
&lt;p&gt;MegaLinter wouldn&#39;t be what it is without its great team of maintainers!&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Kurt-von-Laven&quot;&gt;Kurt Von Laven&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/bdovaz&quot;&gt;Borja Dominguez&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/echoix&quot;&gt;Edouard Choiniere&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/nvuillam&quot;&gt;Nicolas Vuillamy&lt;/a&gt; (Creator)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Contributors&lt;/h3&gt; 
&lt;a href=&quot;https://github.com/oxsecurity/megalinter/graphs/contributors&quot;&gt; &lt;img src=&quot;https://contrib.rocks/image?repo=oxsecurity/megalinter&quot; /&gt; &lt;/a&gt; 
&lt;h3&gt;Open-source teams&lt;/h3&gt; 
&lt;p&gt;MegaLinter obviously would not exist without its linters and libraries: many thanks to all the dedicated open-source teams maintaining these awesome linters!&lt;/p&gt; 
&lt;h3&gt;Super-Linter team&lt;/h3&gt; 
&lt;p&gt;MegaLinter has been built on the ashes of a &lt;a href=&quot;https://github.com/super-linter/super-linter/pull/791&quot;&gt;rejected Pull Request&lt;/a&gt;{target=_blank} on &lt;a href=&quot;https://github.com/super-linter/super-linter&quot;&gt;GitHub Super-Linter&lt;/a&gt;{target=_blank}.&lt;/p&gt; 
&lt;p&gt;Even if I disagree with their decision to remain in Bash, the core team has always been nice and supportive &lt;a href=&quot;https://github.com/super-linter/super-linter/pulls?q=is%3Apr+is%3Aclosed+author%3Anvuillam+review%3Aapproved&quot;&gt;during the time I was a Super-Linter contributor&lt;/a&gt;{target=_blank} 😃&lt;/p&gt; 
&lt;!-- special-thanks-section-end --&gt; 
&lt;!-- license-section-start --&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/raw/main/LICENSE&quot;&gt;GNU Affero General Public License&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- license-section-end --&gt; 
&lt;!-- mega-linter-vs-super-linter-section-start --&gt; 
&lt;!-- markdown-headers
---
title: Compare MegaLinter and SuperLinter
description: Detailed differences between MegaLinter and SuperLinter (performances, reporters, architecture…)
---
--&gt; 
&lt;h2&gt;MegaLinter vs Super-Linter&lt;/h2&gt; 
&lt;p&gt;The hard fork of Super-Linter to Python isn&#39;t just a language switch: Python&#39;s flexibility and libraries enabled many additional features described below.&lt;/p&gt; 
&lt;h3&gt;Security&lt;/h3&gt; 
&lt;p&gt;MegaLinter &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-variables-security.md&quot;&gt;hides many environment variables&lt;/a&gt; when calling the linters.&lt;/p&gt; 
&lt;p&gt;That way you need to trust only MegaLinter core code with your secrets, not the 100+ embedded linters !&lt;/p&gt; 
&lt;h3&gt;Performance&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/#flavors&quot;&gt;MegaLinter flavors&lt;/a&gt; allow using smaller Docker images, reducing pull time.&lt;/li&gt; 
 &lt;li&gt;Thanks to Python multiprocessing, linters are run in parallel, which is much faster than Super-Linter&#39;s Bash script that runs all linters sequentially.&lt;/li&gt; 
 &lt;li&gt;When the linter allows it, call it once with N files, instead of calling it N times with one file.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;More languages and formats linted&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;C&lt;/strong&gt;, &lt;strong&gt;C++&lt;/strong&gt;, &lt;strong&gt;Copy-Paste detection&lt;/strong&gt;, &lt;strong&gt;Credentials&lt;/strong&gt;, &lt;strong&gt;GraphQL&lt;/strong&gt;, &lt;strong&gt;JSON &amp;amp; YAML with JSON schemas&lt;/strong&gt;, &lt;strong&gt;Markdown tables formatting&lt;/strong&gt;, &lt;strong&gt;Puppet&lt;/strong&gt;, &lt;strong&gt;reStructuredText&lt;/strong&gt;, &lt;strong&gt;Rust&lt;/strong&gt;, &lt;strong&gt;Scala&lt;/strong&gt;, &lt;strong&gt;Spell checker&lt;/strong&gt;, &lt;strong&gt;Swift&lt;/strong&gt;, &lt;strong&gt;Visual Basic .NET&lt;/strong&gt; …&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Automatically apply formatting and fixes&lt;/h3&gt; 
&lt;p&gt;MegaLinter can &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/config-apply-fixes.md&quot;&gt;automatically apply fixes performed by linters&lt;/a&gt; and push them to the same branch, or create a Pull Request that you can validate.&lt;/p&gt; 
&lt;p&gt;This is pretty handy, especially for linter errors related to formatting (in that case, you don&#39;t have any manual update to perform)&lt;/p&gt; 
&lt;h3&gt;Run locally&lt;/h3&gt; 
&lt;p&gt;MegaLinter can be run locally thanks to &lt;a href=&quot;https://megalinter.io/mega-linter-runner/&quot;&gt;mega-linter-runner&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Reports&lt;/h3&gt; 
&lt;h4&gt;Capabilities&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;Accuracy: Count the total number of errors, not only the number of files in error.&lt;/li&gt; 
 &lt;li&gt;Show linter version and applied filters for each linter processed.&lt;/li&gt; 
 &lt;li&gt;Reports stored as artifacts on GitHub Actions runs or other remote files 
  &lt;ul&gt; 
   &lt;li&gt;General log&lt;/li&gt; 
   &lt;li&gt;One report file by linter&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Additional Reporters&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/ConsoleReporter.md&quot;&gt;Console&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/ConsoleReporter.jpg?raw=true&quot; alt=&quot;Screenshot&quot; /&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/TextReporter.md&quot;&gt;Text files&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/GitHubCommentReporter.md&quot;&gt;GitHub Pull Request comments&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/GitHubCommentReporter.jpg?raw=true&quot; alt=&quot;Screenshot&quot; /&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/GitlabCommentReporter.md&quot;&gt;Gitlab Merge Request comments&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/GitlabCommentReporter.jpg?raw=true&quot; alt=&quot;Screenshot&quot; /&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/reporters/BitbucketCommentReporter.md&quot;&gt;Bitbucket Pull Request comments&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/images/BitbucketCommentReporter.png&quot; alt=&quot;Screenshot&quot; /&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/AzureCommentReporter.md&quot;&gt;Azure Pull Request comments&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/AzureCommentReporter.jpg?raw=true&quot; alt=&quot;Screenshot&quot; /&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/reporters/MarkdownSummaryReporter.md&quot;&gt;Markdown Summary&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/oxsecurity/megalinter/main/docs/assets/images/MarkdownSummaryReporter_2.png&quot; alt=&quot;Screenshot&quot; /&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/UpdatedSourcesReporter.md&quot;&gt;Updated sources&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/EmailReporter.md&quot;&gt;Email&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/docs/reporters/FileIoReporter.md&quot;&gt;File.io&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Enhanced configuration&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Assisted installation and configuration using a Yeoman generator and JSON schemas for the configuration file&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/mega-linter-runner-generator.gif?raw=true&quot; alt=&quot;Runner Install&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/assisted-configuration.gif&quot; alt=&quot;Assisted configuration&quot; /&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Configure include and exclude regexes for a single language or linter: e.g., &lt;code&gt;JAVASCRIPT_FILTER_REGEX_INCLUDE (src)&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Configure additional CLI arguments for a linter: e.g., &lt;code&gt;JAVASCRIPT_ES_ARGUMENTS &quot;--debug --env-info&quot;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Configure non-blocking errors for a single language or linter: e.g., &lt;code&gt;JAVASCRIPT_DISABLE_ERRORS&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Simplified languages and linters variables 
  &lt;ul&gt; 
   &lt;li&gt;ENABLE = list of languages and formats to apply lint on codebase (default: all)&lt;/li&gt; 
   &lt;li&gt;ENABLE_LINTERS = list of linters to apply lint on codebase (default: all)&lt;/li&gt; 
   &lt;li&gt;DISABLE = list of languages and formats to skip (default: none)&lt;/li&gt; 
   &lt;li&gt;DISABLE_LINTERS = list of linters to skip (default: none)&lt;/li&gt; 
   &lt;li&gt;Variables VALIDATE_XXX are still taken in account (but should not be used in association with ENABLE and DISABLE variables)&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Enhanced documentation&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://megalinter.io/&quot;&gt;HTML documentation&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/html_doc_home.jpg&quot; alt=&quot;HTML doc home&quot; /&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;One page per linter documentation: 
  &lt;ul&gt; 
   &lt;li&gt;&lt;strong&gt;All variables&lt;/strong&gt; that can be used with this linter&lt;/li&gt; 
   &lt;li&gt;List of &lt;strong&gt;file extensions, names and filters&lt;/strong&gt; applied by the linter&lt;/li&gt; 
   &lt;li&gt;Link to MegaLinter default linter configuration&lt;/li&gt; 
   &lt;li&gt;Link to linter website&lt;/li&gt; 
   &lt;li&gt;Link to official page explaining &lt;strong&gt;how to customize the linter rules&lt;/strong&gt;&lt;/li&gt; 
   &lt;li&gt;Link to official page explaining &lt;strong&gt;how to disable rules from source comments&lt;/strong&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;strong&gt;Examples&lt;/strong&gt; of linter command line calls behind the hood&lt;/li&gt; 
   &lt;li&gt;Help command text&lt;/li&gt; 
   &lt;li&gt;Installation commands&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/html_doc_linter.jpg&quot; alt=&quot;HTML doc linter&quot; /&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Installation links for related IDEs&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/oxsecurity/megalinter/raw/main/docs/assets/images/html_doc_ide.jpg&quot; alt=&quot;HTML doc IDE&quot; /&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;README 
  &lt;ul&gt; 
   &lt;li&gt;Separate languages, formats, and tooling formats in the linters table&lt;/li&gt; 
   &lt;li&gt;Add logos for each descriptor&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Plugin management&lt;/h3&gt; 
&lt;p&gt;For less commonly used linters, MegaLinter offers a plugin architecture so anyone can publish plugins.&lt;/p&gt; 
&lt;h3&gt;Simplify architecture and evolutionary maintenance&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Refactoring runtime in Python, for easier handling than Bash thanks to &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/megalinter&quot;&gt;classes&lt;/a&gt; and Python modules&lt;/li&gt; 
 &lt;li&gt;Everything related to each linter is in a &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/megalinter/descriptors&quot;&gt;single descriptor YAML file&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;Easier ongoing maintenance&lt;/li&gt; 
   &lt;li&gt;Fewer conflicts to manage between PRs&lt;/li&gt; 
   &lt;li&gt;A few special cases require a &lt;a href=&quot;https://github.com/oxsecurity/megalinter/tree/main/megalinter/descriptors&quot;&gt;Python linter class&lt;/a&gt;)&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/oxsecurity/megalinter/raw/main/megalinter/Linter.py&quot;&gt;Default behaviors for all linters&lt;/a&gt;, with the possibility to override parts of them for special cases&lt;/li&gt; 
 &lt;li&gt;Hierarchical architecture: Apply fixes and new behaviors to all linters with a single code update&lt;/li&gt; 
 &lt;li&gt;Documentation as code 
  &lt;ul&gt; 
   &lt;li&gt;Generate linters tables (ordered by type: language, format, and tooling format) and include them in the README. &lt;a href=&quot;https://megalinter.io/supported-linters/&quot;&gt;(see result)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;Generate one markdown file per linter, containing all configuration variables, information, and examples &lt;a href=&quot;https://megalinter.io/descriptors/javascript_eslint/&quot;&gt;(see examples)&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Automatic generation of Dockerfiles using YAML descriptors, always using the linter&#39;s latest version 
  &lt;ul&gt; 
   &lt;li&gt;Dockerfile commands (FROM, ARG, ENV, COPY, RUN)&lt;/li&gt; 
   &lt;li&gt;APK packages (Linux)&lt;/li&gt; 
   &lt;li&gt;NPM packages (Node.js)&lt;/li&gt; 
   &lt;li&gt;PIP packages (Python)&lt;/li&gt; 
   &lt;li&gt;GEM packages (Ruby)&lt;/li&gt; 
   &lt;li&gt;Phive packages (PHP)&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Have a centralized exclude list (node_modules, .rbenv, etc.)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Improve robustness &amp;amp; stability&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Test classes for each capability&lt;/li&gt; 
 &lt;li&gt;Test classes for each linter: automatic generation of test classes using &lt;a href=&quot;https://github.com/oxsecurity/megalinter/raw/main/.automation/build.py&quot;&gt;.automation/build.py&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Set up code coverage &lt;a href=&quot;https://codecov.io/gh/oxsecurity/megalinter&quot;&gt;&lt;img src=&quot;https://codecov.io/gh/oxsecurity/megalinter/branch/main/graph/badge.svg?sanitize=true&quot; alt=&quot;codecov&quot; /&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Development CI/CD 
  &lt;ul&gt; 
   &lt;li&gt;Validate multi-status on PR inside each PR (posted from step &quot;Run against all code base&quot;)&lt;/li&gt; 
   &lt;li&gt;Run test classes and code coverage with pytest during validation GitHub Action&lt;/li&gt; 
   &lt;li&gt;Validate descriptor YML files with json schema during build&lt;/li&gt; 
   &lt;li&gt;Automated job to upgrade linters to their latest stable version&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- mega-linter-vs-super-linter-section-end --&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/304830226/0dfd5431-ac15-469a-b5f2-e646bab15acd" medium="image" />
      
    </item>
    
    <item>
      <title>iggredible/Learn-Vim</title>
      <link>https://github.com/iggredible/Learn-Vim</link>
      <description>&lt;p&gt;Learning Vim and Vimscript doesn&#39;t have to be hard. This is the guide that you&#39;re looking for 📖&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Learn Vim (the Smart Way)&lt;/h1&gt; 
&lt;h2&gt;What&#39;s This?&lt;/h2&gt; 
&lt;p&gt;&lt;em&gt;Learn Vim (the Smart Way)&lt;/em&gt; is a guide to learn the good parts of Vim.&lt;/p&gt; 
&lt;p&gt;There are many places to learn Vim: the &lt;code&gt;vimtutor&lt;/code&gt; is a great place to start and the &lt;code&gt;help&lt;/code&gt; manual has all the references you will ever need. However, the average user needs something more than &lt;code&gt;vimtutor&lt;/code&gt; and less than the &lt;code&gt;help&lt;/code&gt; manual. This guide attempts to bridge that gap by highlighting only the key features to learn the most useful parts of Vim in the least amount of time possible.&lt;/p&gt; 
&lt;p&gt;This guide is written for both beginner and advanced Vimmers. It starts out with broad and simple concepts and ends with specific and advanced concepts. If you&#39;re an advanced user already, I encourage you to read this guide from start to finish anyway, because you may learn something new!&lt;/p&gt; 
&lt;h2&gt;Read Locally (with Docker)&lt;/h2&gt; 
&lt;p&gt;You can read this book locally with Docker. Just run:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f book/docker-compose.yml up --build
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then open &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;I Want More Vim Tips!&lt;/h2&gt; 
&lt;p&gt;Follow &lt;a href=&quot;https://twitter.com/learnvim&quot;&gt;@learnvim&lt;/a&gt; for updates, Vim tips, etc.&lt;/p&gt; 
&lt;h2&gt;Support This Project&lt;/h2&gt; 
&lt;p&gt;This guide is and will always be free.&lt;/p&gt; 
&lt;p&gt;If you want to financially support this project, you can either &lt;a href=&quot;https://leanpub.com/learnvim&quot;&gt;purchase this guide on Leanpub&lt;/a&gt; or &lt;a href=&quot;https://www.buymeacoffee.com/iggredible&quot;&gt;buy me a coffee&lt;/a&gt;!&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://leanpub.com/learnvim&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/images/learn-vim-cover.png&quot; width=&quot;100&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.buymeacoffee.com/iggredible&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://cdn.buymeacoffee.com/buttons/v2/default-green.png&quot; alt=&quot;Buy Me A Coffee&quot; style=&quot;height: 60px !important;width: 217px !important;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Table Of Contents&lt;/h2&gt; 
&lt;h3&gt;Prologue&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch00_read_this_first.md&quot;&gt;Ch 0 - Read This First&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Part 1: Learn Vim the Smart Way&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch01_starting_vim.md&quot;&gt;Ch 1 - Starting Vim&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch02_buffers_windows_tabs.md&quot;&gt;Ch 2 - Buffers, Windows, and Tabs&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch03_searching_files.md&quot;&gt;Ch 3 - Opening and Searching Files&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch04_vim_grammar.md&quot;&gt;Ch 4 - Vim Grammar&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch05_moving_in_file.md&quot;&gt;Ch 5 - Moving in a File&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch06_insert_mode.md&quot;&gt;Ch 6 - Insert Mode&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch07_the_dot_command.md&quot;&gt;Ch 7 - The Dot command&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch08_registers.md&quot;&gt;Ch 8 - Registers&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch09_macros.md&quot;&gt;Ch 9 - Macros&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch10_undo.md&quot;&gt;Ch 10 - Undo&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch11_visual_mode.md&quot;&gt;Ch 11 - Visual Mode&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch12_search_and_substitute.md&quot;&gt;Ch 12 - Search and Substitute&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch13_the_global_command.md&quot;&gt;Ch 13 - The Global Command&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch14_external_commands.md&quot;&gt;Ch 14 - External Commands&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch15_command-line_mode.md&quot;&gt;Ch 15 - Command-line Mode&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch16_tags.md&quot;&gt;Ch 16 - Tags&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch17_fold.md&quot;&gt;Ch 17 - Fold&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch18_git.md&quot;&gt;Ch 18 - Git&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch19_compile.md&quot;&gt;Ch 19 - Compile&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch20_views_sessions_viminfo.md&quot;&gt;Ch 20 - Views, Sessions, and Viminfo&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch21_multiple_file_operations.md&quot;&gt;Ch 21 - Multiple File Operations&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Part 2: Customize Vim the Smart Way&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch22_vimrc.md&quot;&gt;Ch 22 - Vimrc&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch23_vim_packages.md&quot;&gt;Ch 23 - Vim Packages&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch24_vim_runtime.md&quot;&gt;Ch 24 - Vim Runtime&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Part 3: Learn Vimscript the Smart Way&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch25_vimscript_basic_data_types.md&quot;&gt;Ch 25 - Vimscript Basic Data Types&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch26_vimscript_conditionals_and_loops.md&quot;&gt;Ch 26 - Vimscript Conditionals And Loops&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch27_vimscript_variable_scopes.md&quot;&gt;Ch 27 - Vimscript Variable Scopes&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch28_vimscript_functions.md&quot;&gt;Ch 28 - Vimscript Functions&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/iggredible/Learn-Vim/master/ch29_plugin_example_writing-a-titlecase-plugin.md&quot;&gt;Ch 29 - Plugin Example: Writing a Titlecase Plugin&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Translations&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://wsdjeg.net/wiki/learn-vim/&quot;&gt;Learn-Vim 中文翻译&lt;/a&gt;(&lt;code&gt;zh-CN&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/victorhck/learn-Vim-es&quot;&gt;Learn-Vim Spanish&lt;/a&gt;(&lt;code&gt;es&lt;/code&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;License &amp;amp; Copyright&lt;/h2&gt; 
&lt;p&gt;The materials here are all © 2020-2021 Igor Irianto.&lt;/p&gt; 
&lt;p&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/4.0/&quot;&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width:0&quot; src=&quot;https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;This work is licensed under a &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/4.0/&quot;&gt;Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/ed0c44a38ad4b8f6a919e24007e48ea3468392aa5eef395b564ef007202716da/iggredible/Learn-Vim" medium="image" />
      
    </item>
    
  </channel>
</rss>
