<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: chrdek</title>
    <description>The latest articles on DEV Community by chrdek (@chrdek).</description>
    <link>https://dev.to/chrdek</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F509913%2F966e061d-c051-46b6-892f-4eedf306dab0.png</url>
      <title>DEV Community: chrdek</title>
      <link>https://dev.to/chrdek</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chrdek"/>
    <language>en</language>
    <item>
      <title>https://dev.to/chrdek/forem-to-devto-platforms-3o87 redirection bug from forem.com please advice.</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Wed, 02 Jul 2025 10:13:52 +0000</pubDate>
      <link>https://dev.to/chrdek/httpsdevtochrdekforem-to-devto-platforms-3o87-redirection-bug-from-foremcom-please-advice-4mj6</link>
      <guid>https://dev.to/chrdek/httpsdevtochrdekforem-to-devto-platforms-3o87-redirection-bug-from-foremcom-please-advice-4mj6</guid>
      <description></description>
      <category>forem</category>
      <category>bug</category>
      <category>support</category>
      <category>devto</category>
    </item>
    <item>
      <title>https://dev.to/chrdek/forem-to-devto-platforms-3o87 &lt;--redirection bug from forem.com please advice.</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Wed, 02 Jul 2025 10:13:34 +0000</pubDate>
      <link>https://dev.to/chrdek/httpsdevtochrdekforem-to-devto-platforms-3o87-redirection-bug-from-foremcom-please-advice-270i</link>
      <guid>https://dev.to/chrdek/httpsdevtochrdekforem-to-devto-platforms-3o87-redirection-bug-from-foremcom-please-advice-270i</guid>
      <description></description>
      <category>forem</category>
      <category>bug</category>
      <category>support</category>
      <category>devto</category>
    </item>
    <item>
      <title>Forem to devto platforms</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Wed, 02 Jul 2025 10:03:27 +0000</pubDate>
      <link>https://dev.to/chrdek/forem-to-devto-platforms-3o87</link>
      <guid>https://dev.to/chrdek/forem-to-devto-platforms-3o87</guid>
      <description>&lt;p&gt;Was wondering why do I need to be logged in first via forem so I can read the articles from dev.to platform?&lt;br&gt;
(I am being redirected from dev.to -&amp;gt;forem.com -&amp;gt;back to dev.to so i can read some blogs etc).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SIDE NOTE:&lt;/strong&gt;&lt;br&gt;
On accessing &lt;a href="https://dev.to/enter"&gt;https://dev.to/enter&lt;/a&gt; I can directly access/login to the platform without being redirected via forem.com.&lt;/p&gt;

&lt;p&gt;Is dev.to migrating blogs or is it a one-time thing that needs to be done on my end. If anyone could answer this, would be grateful.&lt;/p&gt;

&lt;p&gt;Many thanks in advance.&lt;/p&gt;

</description>
      <category>devto</category>
      <category>forem</category>
      <category>website</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The top 11 web application vulnerability scanners with self-hosting and automation</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Sun, 25 May 2025 16:07:43 +0000</pubDate>
      <link>https://dev.to/chrdek/the-top-11-web-application-vulnerability-scanners-with-self-hosting-and-automation-24jm</link>
      <guid>https://dev.to/chrdek/the-top-11-web-application-vulnerability-scanners-with-self-hosting-and-automation-24jm</guid>
      <description>&lt;p&gt;As part of improving your webapp's or blog's overall security posture I have concluded to a simplified listing of the top 11 best choices for software devs and security testers that can measure or take preventative action on specific known vulnerabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: This is not meant to be a holistic and finite list since there is a multitude of security vulnerabilities and zer0-day exploits roaming freely the web and which allow anyone to hack into your webapp. Its only a conclusive list of my own choice, feel free to add anything that is missing from this list.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you consider a layered approach when thinking networked security, I will only be focusing on the layers of the network referencing the web application parts. See OSI-layered model below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feswhmc89f1uzj21zg0pu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feswhmc89f1uzj21zg0pu.png" alt="osi_model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since this list is mainly focused on opensource DAST and SAST vulnerability tools, the relevant infrastructure parts covered are the top 3 OSI parts, relevant to web application testing and are affecting indirectly/directly OS resources. See image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdq5wdrh94h0u8nk0lkne.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdq5wdrh94h0u8nk0lkne.png" alt="osi_model_targeted"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DAST and SAST&lt;/strong&gt; tools mentioned in the list below will mainly scan and perform assessment of the highlighted OSI parts only. (Some may involve lower parts scanning such as probing, ping sweeps but not in the longer run).&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://greenbone.github.io/docs/latest/22.4/kali/index.html#installing-greenbone-community-edition-on-kali-linux" rel="noopener noreferrer"&gt;GreenBone (former OpenVAS) Community Edition + Kali Linux&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Pretty straight-forward installation and setup process, but only runs on one platform and that is Linux (Kali Linux to be more specific). Also a plus is the docker usage for automation that it provides on self-hosted parts and the usage of a Web UI that comes with that. Minimum hardware requirements include only &lt;strong&gt;2 CPU cores and 4GB of RAM&lt;/strong&gt; to run so it can be easily set on small or legacy H/Ware if you intend to build from source and/or install separately.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  2. &lt;a href="https://www.zaproxy.org/getting-started/" rel="noopener noreferrer"&gt;ZAProxy&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Provides good knowledge base and solid online documentation. ZAProxy is always a favorite well-known option for both security testers and webapp developers. Also allows good automation usage by the built-in spidering agent included in its overall capabilities. This still needs to be setup manually on any OSes that supports (incl. Windows,Linux) and it also includes its own dockerized images.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  3. &lt;a href="https://docs.escape.tech/documentation/inventory/domains/" rel="noopener noreferrer"&gt;Escape Technologies DAST Scanner (by escape.tech)&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Includes most commonly used scanning capabilities for vulnerability scanning and also supports GraphQL and other forms of API endpoint security testing. Also has a CLI tool so most testing and reporting can be easily automated on any hosted instances (either Windows or Linux).&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  4. &lt;a href="https://portswigger.net/burp/documentation/dast/setup/self-hosted/which-deployment-option-is-right-for-me" rel="noopener noreferrer"&gt;BurpSuite SelfHosted (by portswigger)&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;One of the most popular vulnerability scanner with added setup support for most Windows OSes (including Server versions) and Linux. Also available as docker and kubernetes deployment. Minimum requirements are mainly dependent on how many scanner testing tasks are running simultaneously. The standard though for CPU cores is 2 with 8 GB of RAM. In terms of automating burp tasks, some special sort of burp snippets are provided also-known-as &lt;a href="https://portswigger.net/burp/documentation/desktop/extend-burp" rel="noopener noreferrer"&gt;'Bambdas'&lt;/a&gt; as stated on their website that can be imported to extend and further customize and automate the standard pre-bundled snippets.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  5. &lt;a href="https://docs.w3af.org/en/stable/index.html" rel="noopener noreferrer"&gt;W3Af Scanner&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Another alternative non-proprietary security relevant scanner that utilizes python only scripting and is a CLI application. This helps with automation and flexibly using it any way possible. Supported by most Linux platforms and unix-based systems (MacOS, Kali Linux) with partially supported setup for Windows as well. Can also be downloaded via Docker and allows for multiple exploit and payload customizations when run.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  6. &lt;a href="https://cirt.net/Nikto2" rel="noopener noreferrer"&gt;Nikto Scanner&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A PERL-based open source web vulnerability scanner that comes with pre-bundled 7000 vulnerabilities to choose from. Installable on most *nix-based systems, on windows as a binary zip file and image deployable Dockerfile. Nikto, allows for fine tuned settings when executing via the command line while launching a built-in attack. This allows for more flexibility. Also on its website besides the detailed usage guide in github wiki, there is a searchable database of default passwords used by  known vendors.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  7. &lt;a href="https://brakemanscanner.org/docs/running/" rel="noopener noreferrer"&gt;Brakeman Scanner&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A least popular option of SAST tool is Brakeman. Brakeman is another free vulnerability scanner designed for Ruby on Rails web applications. It statically analyzes Rails application code so to detect any code issues during development. Run from a single file /binary on most platform, is the ideal choice for RubyOnRails web developers.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  8. &lt;a href="https://wapiti-scanner.github.io/" rel="noopener noreferrer"&gt;Wapiti&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Another popular and python-specific cli tool for testing websites. Supports python-based installs on 3.12,*.13 only and can generate vulnerability reports -with revelant verbosity levels- while performing fuzz-based testing while injecting each attack's payload. Also easily detects bad configs like server 500 errors during test runs.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  9. &lt;a href="https://wfuzz.readthedocs.io/en/latest/" rel="noopener noreferrer"&gt;Wfuzz&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Another fuzzer for web application security testing runs on python (pip installs) and has a strict list of its 5 installation prerequisites that support it. Install guides are also available for docker images, Windows and MacOS. Notable features are its vast fuzz-testing capabilities being able to use cookie, HTTP Verb, Proxy and Authentication fuzzing as well as more advanced fuzz tests such as payload combinations, payload mangling and encoder combinations, all from a single command line.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  10. &lt;a href="https://docs.bearer.com/reference/installation/" rel="noopener noreferrer"&gt;Bearer CLI (by cycode)&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Another good vulnerability and misconfiguration scanner for your web application that runs on the command line and supports also environment secrets scanning and nice html reporting exports as well as many other capabilities. It does not state windows support on its website, but supports installs via Homebrew/Debian/Ubuntu/RHEL/CentOS as well as Docker. It also includes an .sh install script to use directly from their online website.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  11. &lt;a href="https://rgaucher.info/beta/grabber/" rel="noopener noreferrer"&gt;Grabber&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A mini-web crawler that runs on a small single .py file and supports a small range of security-relevant vulnerabilities. Small tool but flexible to use since it supports xml file configurations, this allows targeting multiple sites. If you need something small and portable that adapts to most setups this might be useful. It is dependent on Python 2.4, BeautifulSoup and PyXML and also has a py2exe generated executable version.  &lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;br&gt;
 &lt;/p&gt;
&lt;h4&gt;
  
  
  Extra: public website online scanners
&lt;/h4&gt;

&lt;p&gt;This listing is just in case you need a fast check on your main website's domain and you don't mind external services probing your public record/domains. &lt;strong&gt;NOTE THAT:&lt;/strong&gt; &lt;em&gt;&lt;strong&gt;Overall, most sites on this list are free to use but some might require &lt;em&gt;free&lt;/em&gt; registration to view the scanned results produced after you put your website domain, so please use with care and read the terms of usage beforehand.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sitecheck.sucuri.net/" rel="noopener noreferrer"&gt;Sucuri&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://transparencyreport.google.com/safe-browsing/search" rel="noopener noreferrer"&gt;Google SafeBrowsing URL Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/observatory" rel="noopener noreferrer"&gt;Mozilla Observatory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hostedscan.com/" rel="noopener noreferrer"&gt;HostedScan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://haveibeenpwned.com/" rel="noopener noreferrer"&gt;HaveIBeenPwned&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.immuniweb.com/websec/" rel="noopener noreferrer"&gt;WebSec (by Immuniweb)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pentest-tools.com/website-vulnerability-scanning/website-scanner" rel="noopener noreferrer"&gt;Website Vulnerability Scanner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.scyscan.com/" rel="noopener noreferrer"&gt;ScyScan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webscan.upguard.com/" rel="noopener noreferrer"&gt;Webscan (by Upguard)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://snyk.io/website-scanner/" rel="noopener noreferrer"&gt;Website Scanner (Snyk.io)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://beaglesecurity.com/free-website-security-assessment" rel="noopener noreferrer"&gt;Free Website Security Assessment (by BeagleSecurity)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zerothreat.ai/free-vulnerability-scanner" rel="noopener noreferrer"&gt;Free Vulnerability Scanner&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h4&gt;
  
  
  Other DNS checkers online:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.shodan.io/" rel="noopener noreferrer"&gt;Shodan DNS Query Checker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://search.censys.io/" rel="noopener noreferrer"&gt;Censys Domain and DNS Certificates Checker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mxtoolbox.com/" rel="noopener noreferrer"&gt;MXtoolBox Online DNS and Lookup Tool&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h4&gt;
  
  
  Just in case: That you will need additional help with orchestrating one or more vulnerability testing scenarios or variants, there are still free options out there to use:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/aquasecurity/cloudsploit" rel="noopener noreferrer"&gt;CloudSploit&lt;/a&gt; : This will be helpful in securing a cloud-based deployment or cloud-hosted web application instance.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://gchq.github.io/CyberChef/" rel="noopener noreferrer"&gt;CyberChef&lt;/a&gt; : Can be run with self-hosting, provides a nice web UI to preset any security-relevant scenarios in the form of a recipe, for added tuning during automation which I think is cool.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This additional list is in case anything is missing or invalid in your configuration defaults or customizations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hub.datree.io/" rel="noopener noreferrer"&gt;Datree Configuration Security Scanner&lt;/a&gt; : Detect misconfigurations in a kubernetes deployment and remediation. Can be run on-premises.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.dotenv.org/" rel="noopener noreferrer"&gt;DotEnv&lt;/a&gt; : Secure your secrets in a vault-like way. Immediate leakage detection and prevention.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.doppler.com/docs/install-cli" rel="noopener noreferrer"&gt;Doppler&lt;/a&gt; : Secure secrets management for securing environment setup and additional integrations. Available on most OSes via CLI and includes docker presets.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.gitguardian.com/platform/getting-started/account-creation" rel="noopener noreferrer"&gt;GitGuardian&lt;/a&gt; : Git web app repository protection for secrets and sensitive info leakage (certificates, etc.). Prevents hardcoding most things in your code and allows for usage for most git-based deployments (AWS Cloud, Azure Cloud, Atlassian etc.).&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h4&gt;
  
  
  In case you need to be extra careful and want to do most things on your own, write custom automation and stylish scripts:
&lt;/h4&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8qrjkaqfah8s774aejoj.jpg" rel="noopener noreferrer"&gt;Here is a list of the top 100 security vulnerabilities.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... can be combined with any of this in this public github listing vulnerability scanner categorization below:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/psiinon" rel="noopener noreferrer"&gt;
        psiinon
      &lt;/a&gt; / &lt;a href="https://github.com/psiinon/open-source-web-scanners" rel="noopener noreferrer"&gt;
        open-source-web-scanners
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A list of open source web security scanners
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;open-source-web-scanners&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A list of open source web security scanners on GitHub and GitLab, ordered by Stars. It does not provide in-depth analysis - for more analysis or a wider range of tools, see the links below.&lt;/p&gt;
&lt;p&gt;Note that some large projects have multiple repos - in which case the second most relevant repo is included immediately after and is indented.&lt;/p&gt;
&lt;p&gt;Related: &lt;a href="https://github.com/psiinon/open-source-llm-scanners/" rel="noopener noreferrer"&gt;open-source-llm-scanners&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;General Purpose Web Scanners&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Tools which can find a range of 'unknown' vulnerabilities on any websites.&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Main Site&lt;/th&gt;
&lt;th&gt;Last Commit&lt;/th&gt;
&lt;th&gt;Committers&lt;/th&gt;
&lt;th&gt;Stars&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.zaproxy.org" rel="nofollow noopener noreferrer"&gt;ZAP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/zaproxy/zaproxy/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/39d9cb3c78b858eaf70db4e5d0d7b2302f440a489ffb615daa51d11a9cf395fd/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f7a6170726f78792f7a6170726f7879" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/zaproxy/zaproxy/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5f69b9ac87bdad47640049aab901d265a6d85efae465f5e47a8dee48bd54ce5c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f7a6170726f78792f7a6170726f7879" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/zaproxy/zaproxy/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/be8f39eac62649c0fe0f1a979d65bb4bd5ee46e8c3c28abf33b3021bcdbde2ac/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f7a6170726f78792f7a6170726f7879" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;- &lt;a href="https://github.com/zaproxy/zap-extensions" rel="noopener noreferrer"&gt;ZAP Extensions&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/zaproxy/zap-extensions/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5038fe50a8c06de56d10edc3a5081964228617be4967b1b6003816bf3bb0d0e5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f7a6170726f78792f7a61702d657874656e73696f6e73" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/zaproxy/zap-extensions/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cc1a79937fd2c27e97af78ecf7534c45ccfa52be6187795204403406cb284798/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f7a6170726f78792f7a61702d657874656e73696f6e73" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/zaproxy/zap-extensions/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ccd108c33a282536560ea99df4a179199a17703634ef856998d622c57601e85b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f7a6170726f78792f7a61702d657874656e73696f6e73" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hetty.xyz/" rel="nofollow noopener noreferrer"&gt;Hetty&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/dstotijn/hetty/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a1682b78d738d8b5ac069c6d590afe4a29f3b89c60afcc0e423b9c6ff059d6f7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6473746f74696a6e2f6865747479" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/dstotijn/hetty/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/05211f7ed9948340930c7eab7e2377bb9c42bca9fbdeb35c453d20a2dbe03a73/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6473746f74696a6e2f6865747479" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/dstotijn/hetty/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e6aa86414fdefd13bf29c29ce4900c354ce231bebf5e72eb4e69b861c6e1d3d2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6473746f74696a6e2f6865747479" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://w3af.org/" rel="nofollow noopener noreferrer"&gt;W3af&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/andresriancho/w3af/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/29ef839ffa007a491f3e91e377862c18cff8e1699d3dc4453e5c2f0cc1efc3a1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f616e647265737269616e63686f2f773361662f646576656c6f70" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/andresriancho/w3af/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c9327fd1b86342cd94945a250136a9039896bf94d1d978b5a9b1e150a2a24287/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f616e647265737269616e63686f2f77336166" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/andresriancho/w3af/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/72e64216043c9c135ca4f4c41cd1d7a9123a4c04de130af1bbdddcef5139c7f0/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f616e647265737269616e63686f2f77336166" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.arachni-scanner.com/" rel="nofollow noopener noreferrer"&gt;Arachni&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/Arachni/arachni/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1f5573b9c01d89a6df18ba44c6ed9cff15c7013d911d2f14c8e9f212391c51e6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f41726163686e692f61726163686e69" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/Arachni/arachni/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/08df3f62e8d74dec4ea6e831c945012ca6d7f5cef8586df17de1e41f995ed0e6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f41726163686e692f61726163686e69" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/Arachni/arachni/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/53d44cc3042f3f1f6456e231ac9e8eb052e652b865d80cb421a9f579a71b5bae/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f41726163686e692f61726163686e69" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/flipkart-incubator/Astra" rel="noopener noreferrer"&gt;Astra&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/flipkart-incubator/Astra/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/27ed20ad3054d60db2d4390e5af2a3e3893195d7e918044b71725e00133201e9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f666c69706b6172742d696e63756261746f722f4173747261" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/flipkart-incubator/Astra/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a8f10eaab240ead43a3adeb07691d9f3025ffb994a0c6643bc130de74e83bc3f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f666c69706b6172742d696e63756261746f722f4173747261" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/flipkart-incubator/Astra/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/49c2810c9a06b2b8f0429168955ee3f8812042c64df669082564e7a830a6b945/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f666c69706b6172742d696e63756261746f722f4173747261" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://wapiti-scanner.github.io/" rel="nofollow noopener noreferrer"&gt;Wapiti&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/wapiti-scanner/wapiti/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d331154c44fb63022d95e73383ae0c42930a4d833e7958a408e430e7c741ac9f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f7761706974692d7363616e6e65722f776170697469" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/wapiti-scanner/wapiti/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/10f926d2431b6ec335b1e05fd2e697bbb19f08d968bb7ea61ce1293fd858e3e3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f7761706974692d7363616e6e65722f776170697469" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/wapiti-scanner/wapiti/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/85fd341cee5b559e06b9fcd2dd5eb48103aaf295d2b07b817179f797b3dd6521/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f7761706974692d7363616e6e65722f776170697469" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://code.google.com/archive/p/skipfish/" rel="nofollow noopener noreferrer"&gt;Skipfish&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/spinkham/skipfish/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f3b11374b0d36ddf15e771a282287d211b0bf6bf17d9d372d3caabc3261e832b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f7370696e6b68616d2f736b697066697368" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/spinkham/skipfish/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dc39c55967f2215e49a07dda49fbd3a8712a423eaff040bcba760773ff59ac6f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f7370696e6b68616d2f736b697066697368" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/spinkham/skipfish/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bcb6486dafbbb62fb198240835b38f12e63f1c7421b92a0e6f978dbd1b5a6628/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f7370696e6b68616d2f736b697066697368" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/shenril/Sitadel" rel="noopener noreferrer"&gt;Sitadel&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/shenril/Sitadel/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5161577ee3a1015244469b28e1cf74eb3591ee0307f2d797d68e7678ee1421d7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f7368656e72696c2f5369746164656c" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/shenril/Sitadel/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6cf213de4d6d1e25cb1df34e2f874cd81828bb8fc59e76fb1bc6d3edc641b5ef/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f7368656e72696c2f5369746164656c" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/shenril/Sitadel/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d73f442cf6c5a05abf7f6bb726f2e11e97a2c5e79b96a9c6b2deec123676a271/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f7368656e72696c2f5369746164656c" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/enkomio/Taipan" rel="noopener noreferrer"&gt;Taipan&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/enkomio/Taipan/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/69c629f1b712f9869ac6d1856ad5b5117c97ad434ea3a75648010556fd7775cc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f656e6b6f6d696f2f54616970616e" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/enkomio/Taipan/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c2aca0c9b3cfdbd80f667371d8de02daeaad917d1f50b41882bd904ea1702803/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f656e6b6f6d696f2f54616970616e" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/enkomio/Taipan/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/720c1dea36d8b596200f0039dd35689ec58094694a107b5c3ad3d7d5cf384ddb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f656e6b6f6d696f2f54616970616e" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://subgraph.com/vega/" rel="nofollow noopener noreferrer"&gt;Vega&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/subgraph/Vega/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a13c8344eca0d437eb2e9828ea2ca55e9019c99c44d72789d50bbd5fd6c73b53/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f73756267726170682f56656761" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/subgraph/Vega/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/847de6fafcf5bcf15cd05530f5fc0bb0777389c9fd1b3b6c77d0c02355c18230/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f73756267726170682f56656761" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/subgraph/Vega/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/11478c27dd7b8aeaddd0fe6a003034898e78dccd80aa6eafe53359341ef96665/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f73756267726170682f56656761" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ghostsecurity.github.io/reaper/" rel="nofollow noopener noreferrer"&gt;Reaper&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/ghostsecurity/reaper/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f283d1adadbbcc2c8d2e6fc28e3adaab716547c554cacee4e9cf7c37820b3653/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f67686f737473656375726974792f726561706572" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/ghostsecurity/reaper/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b1d705620846388d0b146e1effbec2a7423517454fc1f5319e95095a01b5be2b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f67686f737473656375726974792f726561706572" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/ghostsecurity/reaper/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/257d9fe9d364f444c4d30126d9d79fe19b9bdbb525aae47367a2510372327528/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f67686f737473656375726974792f726561706572" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/netsquare/BrowserBruter" rel="noopener noreferrer"&gt;BrowserBruter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/netsquare/BrowserBruter/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/51b907efdf30f7a6663db1977229332e5ccd95132328f551b357b928078dce6a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6e65747371756172652f42726f77736572427275746572" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/netsquare/BrowserBruter/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/976f9b465d86bfb81d705c17c92c49744ab34ea633eb73d3dc1f5e19270c5b65/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6e65747371756172652f42726f77736572427275746572" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/netsquare/BrowserBruter/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/736b57b2a389d57caf62dac5e4ba9992b39afd18d46a6a15cb34f42cbb597a50/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6e65747371756172652f42726f77736572427275746572" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/tulpar/tulpar" rel="noopener noreferrer"&gt;Tuplar&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/tulpar/tulpar/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cfc03d45d2f3651c9ef8be64ab28781f5edcce5f582c6b5ff85938f1ae57cb65/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f74756c7061722f74756c706172" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/tulpar/tulpar/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5efc28041335d0fa24cc0b9111c7b1f65226c97641b9e04625baaddabb317f60/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f74756c7061722f74756c706172" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/tulpar/tulpar/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/422f206714f1cd13ff1388629231adc7410c36df4db12ec9cce9b3be0b30c602/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f74756c7061722f74756c706172" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/detectify/ugly-duckling" rel="noopener noreferrer"&gt;Ugly-duckling&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/detectify/ugly-duckling/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f2cd5fbc2aee96556a7bc66c95b374ec50dc573b0057d345d81a4af6c08a995d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6465746563746966792f75676c792d6475636b6c696e67" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/detectify/ugly-duckling/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0ae5dace08d76102f7e1497de6184e6348eaf547188b238297b99bcde24e8217/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6465746563746966792f75676c792d6475636b6c696e67" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/detectify/ugly-duckling/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/445a7561232b91273586693e143d3fa05afb7ebd6e1e8edc7b3d349ff87a253a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6465746563746966792f75676c792d6475636b6c696e67" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/war-and-code/jawfish" rel="noopener noreferrer"&gt;Jawfish&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/war-and-code/jawfishO/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e9ce3e6899d8486f71e44d0220fc1348dbdfb8d614919b732ddf59d9485447fe/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f7761722d616e642d636f64652f6a617766697368" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/war-and-code/jawfish/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/08520a90a2828b36c922d6372126444ba68314622340e0ae40df849a7ff9b15d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f7761722d616e642d636f64652f6a617766697368" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/war-and-code/jawfish/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/481866ef608ff2d8822b219af0fa229c287b0a60f3efac88499909a97fe060f0/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f7761722d616e642d636f64652f6a617766697368" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/forensant/pakiki-core" rel="noopener noreferrer"&gt;Pākiki&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/forensant/pakiki-core/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8f05aab3f165bb2df1a564043728b5148d4f0d3d3db9172143145bc5bd41b5bf/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f666f72656e73616e742f70616b696b692d636f7265" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/forensant/pakiki-core/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/81b2e56d8bfc32f16b0831571e4ae785474e8abeacb1f6c329cd7da4cf84b60c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f666f72656e73616e742f70616b696b692d636f7265" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/forensant/pakiki-core/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e1f5f493252db2a239979784628c7726b18f91a4c1847d22638f183e00eef1ab/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f666f72656e73616e742f70616b696b692d636f7265" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/al-sultani/prokzee" rel="noopener noreferrer"&gt;ProKZee&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/al-sultani/prokzee/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/722113919ca54c2f8997c733d63be5280fad99ef5fc142f834537e283c943ecb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f616c2d73756c74616e692f70726f6b7a6565" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/al-sultani/prokzee/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d740e9c49f25d2decf9f20f658a2e03015015fd92cc7931644bd973ecb2a08e1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f616c2d73756c74616e692f70726f6b7a6565" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/al-sultani/prokzee/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/227fb8735375160a377c2292f45ba57e27ed3e6ba88f421cf55b7ef64498cf4d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f616c2d73756c74616e692f70726f6b7a6565" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://gitlab.com/wirepair/browserker/" rel="nofollow noopener noreferrer"&gt;Browserker&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://gitlab.com/wirepair/browserker/-/commits/master" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6d1e8d2a0a6680aa3895a09593db7c8b1b0fc44d1f55759020e8ef736011cd3e/68747470733a2f2f696d672e736869656c64732e696f2f6769746c61622f6c6173742d636f6d6d69742f3138323133363333" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://gitlab.com/wirepair/browserker/-/graphs/master" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/03fceb1e68f441b5035056dfeae776685e3942754825b2fdf913ecc4708b4943/68747470733a2f2f696d672e736869656c64732e696f2f6769746c61622f636f6e7472696275746f72732f3138323133363333" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://gitlab.com/wirepair/browserker/-/starrers" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/52e886c221e437a936791401ae72f01f7210047347e9efc32b4de10818b55430/68747470733a2f2f696d672e736869656c64732e696f2f6769746c61622f73746172732f3138323133363333" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Infrastructure Web Scanners&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Tools which can find a range of 'known' vulnerabilities on any websites.&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Main Site&lt;/th&gt;
&lt;th&gt;Last Commit&lt;/th&gt;
&lt;th&gt;Committers&lt;/th&gt;
&lt;th&gt;Stars&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://nuclei.projectdiscovery.io/" rel="nofollow noopener noreferrer"&gt;Nuclei&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/projectdiscovery/nuclei/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/07c90ea139c9887ae8118506c7370996dcb2ff7fdba2faac146f1bc1bfa5466b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f70726f6a656374646973636f766572792f6e75636c6569" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/projectdiscovery/nuclei/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7bf580e1c980e9bf7e1bd7e178500c780b7a73a4d6c9c34391aab0d2d0b5e6fb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f70726f6a656374646973636f766572792f6e75636c6569" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/projectdiscovery/nuclei/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c255838740f6fba79579822ef7368b5bf35d774ab25b1aee4a784a4780b4bc18/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f70726f6a656374646973636f766572792f6e75636c6569" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;- &lt;a href="https://github.com/projectdiscovery/nuclei-templates/" rel="noopener noreferrer"&gt;Nuclei Templates&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/projectdiscovery/nuclei-templates/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d0523b2f2a67bddd91691d53344588c8f6b0aa90f9c681fe310bb7d55afd295d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f70726f6a656374646973636f766572792f6e75636c65692d74656d706c61746573" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/projectdiscovery/nuclei-templates/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/56a19889a34b79d0e8d46bc9fbd4570ca71b896e75c1f275bb37d8cb44392c85/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f70726f6a656374646973636f766572792f6e75636c65692d74656d706c61746573" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/projectdiscovery/nuclei-templates/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dc396e0c0df00c4d2c4f9b336740bbc144cda891ee3754d358626f6695d1ff97/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f70726f6a656374646973636f766572792f6e75636c65692d74656d706c61746573" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/chaitin/xray" rel="noopener noreferrer"&gt;Xray&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/chaitin/xray/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7725d0647b4fc9b66c904daec99e860baa9dfcae4aa896c7bdc8301a1aaa834a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6368616974696e2f78726179" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/chaitin/xray/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bcf3e14d7363b01a5da79ee377f8a71153ac2198d12771b41d050cf7104c2a26/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6368616974696e2f78726179" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/chaitin/xray/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/818973df2dfda5e09d704815b33ebdff8b3e66a43016e94e87be06eacbca7b21/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6368616974696e2f78726179" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/google/tsunami-security-scanner" rel="noopener noreferrer"&gt;Tsunami&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/google/tsunami-security-scanner/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d140fee86380012fe13279df0ac3112338b0da84eedee55b7691bbaedb8cc0a6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f676f6f676c652f7473756e616d692d73656375726974792d7363616e6e6572" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/google/tsunami-security-scanner/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/27e5be92c300d0efcaf85add7bba7aa24b9ce5d007f526ff4e55789e65023b10/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f676f6f676c652f7473756e616d692d73656375726974792d7363616e6e6572" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/google/tsunami-security-scanner/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ee81d06501a0ca0ee38b6353a9798ffbabf0da61d5085adfea05e5f110b65d97/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f676f6f676c652f7473756e616d692d73656375726974792d7363616e6e6572" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://cirt.net/Nikto2" rel="nofollow noopener noreferrer"&gt;Nikto&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/sullo/nikto/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9c886b4bdb3b07bcd09ab10f4f38a670a5e8fff7192b64342810da3435fa03d3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f73756c6c6f2f6e696b746f" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/sullo/nikto/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2bde301e9466d49da0f7998b5f5a07e2fc7dff1ad824d66e8c72b406aa5d7410/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f73756c6c6f2f6e696b746f" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/sullo/nikto/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/91e8cede87574cecd78d327fe6e78115326704d88faa404c4850ac0e4f73a000/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f73756c6c6f2f6e696b746f" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/s0md3v/Striker" rel="noopener noreferrer"&gt;Striker&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/s0md3v/Striker/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ebcc9b7b86f69296e1d35c2912295100b683f8e0841f64dbae61a6591333d3ad/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f73306d6433762f537472696b6572" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/s0md3v/Striker/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e39166242bab02185930f39230f642408b8ab4340eb880963c8458edec766b17/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f73306d6433762f537472696b6572" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/s0md3v/Striker/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c7f8e8bee94bc4940c2150c543225f98b56fd55abb731f831f70ac4d21d1fae4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f73306d6433762f537472696b6572" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/jaeles-project/jaeles" rel="noopener noreferrer"&gt;Jaeles&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/jaeles-project/jaeles/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/952a52a16216a6d59e9c874d8fa45ccf00eb84bab3d14e7883c1db71877df464/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6a61656c65732d70726f6a6563742f6a61656c6573" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/jaeles-project/jaeles/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/019ac7d44a046aa8c262b77a9784af98ddd1752cb9f7d877c65bca64b2754e5e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6a61656c65732d70726f6a6563742f6a61656c6573" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/jaeles-project/jaeles/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/22d45e78fb7f8f5df85eb04c1fdb54b7d70694ac4a65995766f2f7e35fac08a4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6a61656c65732d70726f6a6563742f6a61656c6573" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;- &lt;a href="https://github.com/jaeles-project/jaeles-signatures" rel="noopener noreferrer"&gt;Jaeles-Signatures&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/jaeles-project/jaeles-signatures/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d4b40641211b66bbfd617e149f852607c827046e9e15c1ee81cc4d86b738c9bc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6a61656c65732d70726f6a6563742f6a61656c65732d7369676e617475726573" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/jaeles-project/jaeles-signatures/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/47159d9feacdbc50872ba20a6f31d124bc956d7ac58255caf798d374164ac669/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6a61656c65732d70726f6a6563742f6a61656c65732d7369676e617475726573" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/jaeles-project/jaeles-signatures/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/31258d2146be0fea96ffc9b72cf2dcf90374c38359eec9ef57b717532f39f0bf/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6a61656c65732d70726f6a6563742f6a61656c65732d7369676e617475726573" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/0xsauby/yasuo" rel="noopener noreferrer"&gt;Yasuo&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/0xsauby/yasuo/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8ee0dc70de81482b2390247c03bbdba18ca678514a7aa368638f4d7f21193266/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f307873617562792f796173756f" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/0xsauby/yasuo/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/664ef52e3247f8b6264d70f3b4fd3d75f1f02b5039e2020d54c9a005215c55d8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f307873617562792f796173756f" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/0xsauby/yasuo/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0faf4c5b444cd2748fe576ddcaccbc08e330c3c493752a539d2553b8adfebdf0/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f307873617562792f796173756f" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://observatory.mozilla.org/" rel="nofollow noopener noreferrer"&gt;Observatory&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mozilla/http-observatory-website/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d116cc74825174a2698763110d26087a430f5dd446a7002106eb302d86365714/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6d6f7a696c6c612f687474702d6f627365727661746f72792d77656273697465" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mozilla/http-observatory-website/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/00342765232d7d70096d6fba854794c30f65f57c6ed57b68f902c6a1eeb7958a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f6d6f7a696c6c612f687474702d6f627365727661746f72792d77656273697465" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/mozilla/http-observatory-website/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/284a3e6080b2cca503f4872ebfa4d3114023715a1ffa1e911fcc7743eb625ae9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6f7a696c6c612f687474702d6f627365727661746f72792d77656273697465" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/infosecsecurity/Spaghetti" rel="noopener noreferrer"&gt;Spaghetti&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/infosecsecurity/Spaghetti/commits" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a8e7abe3efa53589907d72ee6f93681cffe06682d67de8410589516ffda343dc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f696e666f73656373656375726974792f537061676865747469" alt="Last Commit"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/infosecsecurity/Spaghetti/graphs/contributors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/828c2992e2fee7ec3c8a56567318bb604faf84510df72d9aa67b2e37608e0d6c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f696e666f73656373656375726974792f537061676865747469" alt="Contributors"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/infosecsecurity/Spaghetti/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0be160a50508d2df88d051c7953c6dd04c329a0daa57620dcc7876cf62793986/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f696e666f73656373656375726974792f537061676865747469" alt="Stars"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Fuzzers / Brute Forcers&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Tools which focus on throwing 'bad…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/psiinon/open-source-web-scanners" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>burpsuite</category>
      <category>vulnerability</category>
      <category>scanners</category>
      <category>xss</category>
    </item>
    <item>
      <title>Amazon Q Developer Challenge: Lambda-Based Picture Processing Utility</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Sun, 04 May 2025 20:10:02 +0000</pubDate>
      <link>https://dev.to/chrdek/amazon-q-developer-challenge-lambda-based-picture-processing-utility-1ljf</link>
      <guid>https://dev.to/chrdek/amazon-q-developer-challenge-lambda-based-picture-processing-utility-1ljf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aws-amazon-q-v2025-04-30"&gt;Amazon Q Developer "Quack The Code" Challenge&lt;/a&gt;: Exploring the Possibilities&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;What I was going for initially was an AWS Lambda-Based mini-clone of Cloudinary's cloud-based image processing API platform, but in the process I realized that Amazon's Q Developer cli produced code flexible enough to integrate with most external npm libraries out there.&lt;/p&gt;

&lt;p&gt;Both API responsibilities and layers are separated so that external libraries such as pdf conversion utilities and 3d renders can be included in the future dynamically and with minimal effort.&lt;/p&gt;

&lt;p&gt;So overall what was made, is a node.js v.17^ compliant image processing utility that currently supports the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Several Image Transformation Operations (Resize, Blur, Grayscale conversion, Format Conversion, Quality Enhancement etc.)&lt;/li&gt;
&lt;li&gt;Image to Pdf Conversion Operations (Image to PDF conversion, PDF Metadata editing, Auto resize to fit-image-to PDF).&lt;/li&gt;
&lt;li&gt;Can be run on the cloud for automation via Lambda API Gateway.&lt;/li&gt;
&lt;li&gt;Includes built-in infrastructure templates to add WAF (Web Application Firewall) with relevant rate limitation for overusing AWS Lambda endpoints.&lt;/li&gt;
&lt;li&gt;Can be run by docker (included in the documentation).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Entire Architecture Presented below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxq9wvbpvl0ttwglcom21.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxq9wvbpvl0ttwglcom21.png" alt="Architectural Diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is not added (yet):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;STL file import /processing for 3d content.&lt;/li&gt;
&lt;li&gt;Handling multiple images in parallel.&lt;/li&gt;
&lt;li&gt;More usable and friendlier UI.&lt;/li&gt;
&lt;li&gt;Additional tests and infrastructure checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Standard use case displayed below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhukv0hyxwi3nuznsdhq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhukv0hyxwi3nuznsdhq.png" alt="Image Import"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and in animated capture below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fga6wh5ovw0qg50bqty6x.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fga6wh5ovw0qg50bqty6x.gif" alt="Image Import Video"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Repository
&lt;/h2&gt;

&lt;p&gt;All code is strictly written by Amazon Q + VS Code (yes even README.md) and presented with &lt;strong&gt;the relevant documentation&lt;/strong&gt; in the publicized repository in the link below:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/chrdek" rel="noopener noreferrer"&gt;
        chrdek
      &lt;/a&gt; / &lt;a href="https://github.com/chrdek/PicProcessor" rel="noopener noreferrer"&gt;
        PicProcessor
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      AWS Lambda function for image processing and PDF conversion with DDoS protection and Docker support
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Image Processor Lambda Function 🖼️&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Generated with Amazon Q 🤖 🦆&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This project contains an AWS Lambda function built with Node.js 17+ that processes images from an S3 bucket and returns them through API Gateway. The implementation includes robust DDoS protection, rate limiting, PDF conversion, and Docker support for local development and testing.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Project Structure&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;PicProcessor/
├── src/                    # Source code for the Lambda function
│   ├── index.js            # Main Lambda handler with rate limiting
│   ├── imageProcessor.js   # Image processing logic
│   ├── pdfConverter.js     # PDF conversion functionality
│   └── local.js            # Local development server
├── tests/                  # Unit tests using Mocha and Chai
│   ├── index.test.js       # Tests for the Lambda handler
│   ├── imageProcessor.test.js # Tests for the image processor
│   └── pdfConverter.test.js # Tests for the PDF converter
├── localstack/             # LocalStack initialization scripts
│   └── init-s3.sh          # Script to initialize S3 bucket
├── Dockerfile.lambda       #&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/chrdek/PicProcessor" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Used Amazon Q Developer
&lt;/h2&gt;

&lt;p&gt;What I used, was VS Code + Amazon Q plugin.&lt;/p&gt;

&lt;p&gt;Codewise, an empty folder and a .gitignore file with Amazon Q plugin + VS Code was created to get me started. (Note: The ignore file was overwritten by Amazon Q later in the process).&lt;/p&gt;

&lt;p&gt;Using this little, Amazon Q handles all the workload for you and code modifications from within VS Code when adding or handling file changes.&lt;br&gt;
&lt;strong&gt;Overall, no code was written by myself. Only git commands to deploy to remote repository.&lt;/strong&gt;&lt;br&gt;
 AI-Guided Coding process was like so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generated Code based on node version + packages required as dependencies.&lt;/li&gt;
&lt;li&gt;Generated the corresponding tests code parts to run alongside the parts of the code.&lt;/li&gt;
&lt;li&gt;Generated lambda-relevant code for usage of api gateway + corresponding deployment templates. This was also updated to include code for handling uploaded files on the s3 bucket.&lt;/li&gt;
&lt;li&gt;Added more features like WAF (Web Application Firewall) so that to handle rate limiting for the api etc.&lt;/li&gt;
&lt;li&gt;Generated the code files for docker and docker-compose usage.&lt;/li&gt;
&lt;li&gt;Updated when necessary and informed the AI of changes and noted to update the relevant files &lt;strong&gt;(Repeat until satisfied).&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This was also to have a proof-of-concept of how capable a 2025 AI is in writing code. All infrastructure deployment files + Readme/Licenses added by A.I. assistant and some Amazon Q IDE plugin responses are shown below:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fok4o1jl41xzauh05tglz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fok4o1jl41xzauh05tglz.png" alt="Amazon Q AI Response Sample"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Importantly highlighted part of this is that Amazon Q added (and justified the license referenced in the readme). By default it selected ISC due to the nature of the solution (node.js with Npm packages in the json file).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OVERALL: A major benefit of using the IDE alongside the built-in plugin is that you get to modify your own context and thus, easily bulk-update the files included already in your solution.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>awschallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Graph databases top 6 setups and configurations.</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Wed, 26 Mar 2025 14:29:10 +0000</pubDate>
      <link>https://dev.to/chrdek/graph-databases-top-6-setups-and-configurations-ep</link>
      <guid>https://dev.to/chrdek/graph-databases-top-6-setups-and-configurations-ep</guid>
      <description>&lt;p&gt;The core part of web devs and software engineer best efforts when designing distributed applications, would be to avoid cases of highly congested network traffic.&lt;br&gt;
This is mainly done to prevent bottlenecks in the public network that the webapp or system runs on and to have flexible data handling. This might also be done to prevent DDoS attempts at an account of a webapp.&lt;br&gt;
Usually this is done by utilizing caching and streaming mechanisms provided as part of ready-made webapp/content hosting techstack.&lt;br&gt;
A major part of online content hosting infrastructures would be graph-based distributed schemas and their respective graph-based Database technologies that support it.&lt;/p&gt;

&lt;p&gt;In a brief explanation on how graph databases work that would be described as below set of basic rules -and differences from traditional dbs-&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Graph databases use nodes and edges to represent data relationships whereas in a relational database keys and columns relations to keys are used to do this.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A graph database has a flexible data schema (like NoSQL databases) and data types can easily added/modified whereas in a relational database data set structures cannot change as easily (data types, relations etc.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Graph with dbs are mostly used in recommendation systems, ML and ai-driven systems that have to do with social networks like facebook, fraudulent activity detection etc. Traditional db structures are wider-spread and can be used with stricter data handling domains such as data warehousing and BI/analytics systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a learning curve, graph db concepts are more difficult to grasp by early developers but relational dbs can be taught more easily and used by most people in general.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An example of how a graph database can be used in a real-life application can be found below:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwpw4hpe8kcrs0g3pjxi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwpw4hpe8kcrs0g3pjxi.png" alt="Graph Database Image" width="533" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Legend for example: &lt;strong&gt;Arrows&lt;/strong&gt; are indicated as &lt;strong&gt;graph db edges,&lt;/strong&gt; &lt;strong&gt;circles&lt;/strong&gt; are the &lt;strong&gt;nodes&lt;/strong&gt; of the graph and a &lt;strong&gt;vertex&lt;/strong&gt; of the db structure would be denoted by at least three nodes (circles) and two edges (arrows) 'aka' &lt;strong&gt;V-shape&lt;/strong&gt; in the graph.&lt;br&gt;
How this works in regards to querying an graph-based entity structure would be as follow:&lt;/p&gt;

&lt;p&gt;To retrieve the tutor that has as a corresponding student A from STUDENTS_REGISTRY would require classroom-to-tutor edge (with classroom, tutor nodes included &lt;strong&gt;as operation1&lt;/strong&gt;) and tutor-to-studentsregistry edge (with both tutor, studentsregistry nodes included &lt;strong&gt;as operation2&lt;/strong&gt;).&lt;br&gt;
The set of individual nodes and edges for &lt;strong&gt;operation1&lt;/strong&gt; is called a &lt;strong&gt;graph link (E1)&lt;/strong&gt; to indicate linking of a tutor node to a classroom node. The other set that handles the linking of a tutor node to a studentsregistry node is  by &lt;strong&gt;graph link  (E2).&lt;/strong&gt; This can go up until the length N for the entire length of nodes and vertices in the graph.&lt;/p&gt;

&lt;p&gt;In noticing the linearity in the relations of the above, usually linear algebraic operations are used to extract such information from a graph-based data structure.&lt;br&gt;
&lt;em&gt;This is just an over-simplified way of how this is implemented in an actual graph-based database engine.&lt;/em&gt;&lt;br&gt;
&lt;a href="https://medium.com/basecs/a-gentle-introduction-to-graph-theory-77969829ead8" rel="noopener noreferrer"&gt;More info on how graphs work can be found here...&lt;/a&gt;&lt;br&gt;
 &lt;br&gt;
&lt;a href="https://medium.com/the-andela-way/graph-databases-why-are-they-important-c438e1a224ae" rel="noopener noreferrer"&gt;...and here for graph databases&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;NOTE THAT: The example indicates a DiGraph (or Directional Graph) usage of the system. This is also common in binary tree data structures and indicates a more strict layout of information.&lt;br&gt;
If a unidirectional graph where to be used, there wouldn't be any arrow indicators to create the data relations in the entities (nodes) of the system. This would indicate a more flexible data relationship schema, which is usually what is applicable to actual graph db-based technologies.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Either &lt;em&gt;digraph&lt;/em&gt; or &lt;em&gt;unidirectional&lt;/em&gt; graph Db is used as an underlying data source, each one has its perks and disadvantages in terms of workload handling, flexibility of data structuring and directed DoS attacks on the data structures.&lt;/p&gt;

&lt;p&gt;As a main part of this, here is a listing of the &lt;strong&gt;top 6 graph-based backing stores&lt;/strong&gt; that are utilized by most content delivery/hosting stacks for distributing web content online:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Neo4j DB
&lt;/h2&gt;

&lt;p&gt;One the most popular graph-based database frameworks, has its own language and query engine (known-as Cypher) which also supports some proprietary structures such as SAP HANA Graph.&lt;br&gt;
Overall in its functionality supports CSV imports, db interoperability and both Cloud-hosting and Self-hosting deployments to use.&lt;br&gt;
Aside from a large knowledge-base with detailed documentation and tutorials, it has also video tutorials and guided learning for understanding how to use its vast range of features.&lt;br&gt;
Also supports query and graph visualization via its dashboard capability which is called  NeoDash and a local IDE called Neo4j Desktop.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;u&gt;&lt;strong&gt;General Info&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
&lt;strong&gt;Important features:&lt;/strong&gt; Self-Hosting by Docker, Kubernetes, AWS/GCP/MS Azure Cloud or fully managed Cloud-based hosting via Neo4jAuraDB. Also includes IDE support via Neo4j Desktop and NeoDash for visualization.&lt;br&gt;
Also CVE (Common Vulnerability Exploits) supported on its knowledge base and continuously checked by their open-source platform.&lt;br&gt;
&lt;strong&gt;Where is applicable:&lt;/strong&gt; Generalized purpose graph database, preferrable for structuring LLMs and Machine Learning for business-level analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://neo4j.com/docs/getting-started/" rel="noopener noreferrer"&gt;Official Info&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  2. GraphDB
&lt;/h2&gt;

&lt;p&gt;One of the most familiar graph databases that has added built-in support for RDF schemas and SPARQL. This can make it easy to use with ontological frameworks/ontologies for more context-driven machine-learning scenarios for supervised learning. Also supports clustered operation with built-in memory caching capabilities and docker/kubernetes/helm deployments. The kubernetes templates allow for a higher level of detail and complexity for self-hosted instances.&lt;br&gt;
It also includes a monitoring panel with partial SPARQL query syntax support called GraphDB Workbench. Alongside coding and administrative features it includes a set of &lt;a href="https://graphdb.ontotext.com/documentation/10.1/command-line-tools.html" rel="noopener noreferrer"&gt;CLI-commands&lt;/a&gt; that support vast range of operations such as RDF schema validations etc.&lt;/p&gt;

&lt;p&gt;Other important feature is it's high-grained access controls via LDAP/kerberos and other authentication schemes but this is a hassle to be setup and needs to be done manually. Instructions mainly provided by official documentation and vast stackoverflow supportbase on their website.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;u&gt;&lt;strong&gt;General Info&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
&lt;strong&gt;Important features:&lt;/strong&gt; Built-in support for SPARQL and RDF schemas, supports clustered deployments and also self-hosting via kubernetes/docker/helm. Also has a built-in monitoring and administration tool with small IDE features for queries.&lt;br&gt;
&lt;strong&gt;Where is applicable:&lt;/strong&gt; Machine learning with ontological frameworks and a.i./ranking algorithms and relevant taxonomies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://graphdb.ontotext.com/documentation/10.1/index.html" rel="noopener noreferrer"&gt;Official Info&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  3. ApolloGraphQL + GraphOS
&lt;/h2&gt;

&lt;p&gt;One of the most popular graph database for project working with dev teams and multiple deployments and DevOps scenarios is ApolloGraphQL. It includes a built-in GraphOS Router by which a flexible RESTful API is exposed for handling multiple microservices at once. It's scalable infrastructure allows for ease of use across many development teams and whenever CI/CD automation is required in larger enterprise projects.&lt;br&gt;
Also includes an in-browser IDE setup locally and self-hosting capabilities for GraphOS Router or Apollo Router Core, &lt;a href="https://www.apollographql.com/docs/graphos/routing/self-hosted/resource-management" rel="noopener noreferrer"&gt;on Docker or Kubernetes.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;u&gt;&lt;strong&gt;General Info&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
&lt;strong&gt;Important features:&lt;/strong&gt; Full in-Browser IDE with graph query execution plans and visualizations. Flexibility of CI/CDs with SDK and RESTful API connectors via GraphOS Router (with GRPC, SOAP etc). Also it has a good support base and useful &lt;a href="https://www.apollographql.com/docs/?utm_campaign=2023-github-readme&amp;amp;utm_source=github-readme" rel="noopener noreferrer"&gt;documentation.&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Where is applicable:&lt;/strong&gt; Vast range of features that make it useful in literally any Machine Learning/ranking distributed application from medium to larger enterprises. Also useful where you require to have MLOps (Machine Learning Operations) or DevOps in a large web and back-end developers team (either github, gitlab).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.apollographql.com/" rel="noopener noreferrer"&gt;Official Info&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  4. TigerGraph DB
&lt;/h2&gt;

&lt;p&gt;TigerGraph is a more proprietary and enterprise-level graph database product that is also backed by detailed docs and tutorials knowledgebase.&lt;br&gt;
The paid products on their website already are provided as default enterprise level packages whereas also community editions are included for free.&lt;br&gt;
It also supports Docker self-hosting, with online instructions, for both Ubuntu and CentOS deployments for the corresponding environments. In addition kubernetes self-hosting is available on AWS (EKS), Google's (GKE), RedHat OpenShift and MS Azure (AKS).&lt;br&gt;
Apparently, a lot of detail has been added on the online docs about how to run it directly on Linux H/W with the relevant amount of info and &lt;a href="https://docs.tigergraph.com/tigergraph-server/4.2/installation/hw-and-sw-requirements#_hardware_recommendations" rel="noopener noreferrer"&gt;minimum supported hardware.&lt;/a&gt; A list of all the Linux distros that currently supports, is as below (note: it does not run on Windows or Macintosh).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operating System&lt;/th&gt;
&lt;th&gt;Supported&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RedHat (RHEL) 7.0 to 8.9&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RedHat (RHEL) 9&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CentOs 6.5 to 8.0&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 16.04 LTS&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 18.04 LTS&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 20.04 LTS&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 22.04 LTS&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debian 10 &amp;amp; 11&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suse 12&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Linux 8.0 to 8.4&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows (all version)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MacOS (Intel and M1 chip)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In addition to that, it supports out-of-the-box a RESTful API for data driven operations (similar to ApolloGraph) and highly-refined built-in RBAC controls that support multiple user roles and access levels. Also has many interesting features via its &lt;strong&gt;&lt;a href="https://docs.tigergraph.com/tigergraph-server/4.2/api/built-in-endpoints" rel="noopener noreferrer"&gt;RESTPP Built-in capability&lt;/a&gt;&lt;/strong&gt; that also include open metrics and status monitoring alongside hyper vertices handling and linear operations with edges/vertex retrieval and the underlying path-finding algorithms that come with it.&lt;br&gt;
Most of the above, are monitored by a fully-blown web IDE aka &lt;strong&gt;&lt;a href="https://docs.tigergraph.com/gui/4.2/intro/" rel="noopener noreferrer"&gt;GraphStudio and a management interface supported by the Admin Portal dashboard&lt;/a&gt;&lt;/strong&gt; which is also web browser accessible.&lt;/p&gt;

&lt;p&gt;Overall a decent product for graph-based operations that also supports high-availability clustered configuration wherever required.&lt;br&gt;
 &lt;br&gt;
&lt;u&gt;&lt;strong&gt;General Info&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
&lt;strong&gt;Important features:&lt;/strong&gt; The most important parts of TigerGraph are its vast documentation resource base such as forums, developer site, documentation with knowledgebases and the highly-refined built-in capabilities that includes such as: RBAC controls, REST API and monitoring capabilities.&lt;br&gt;
&lt;strong&gt;Where is applicable:&lt;/strong&gt; Can support a vast range of Machine learning Models setups for both startups  (community edition) and larger companies (enterprise edition), also for algorithmic applicability and usage. It can also be setup and used easily for MLOps and DevOps. Also usable for adding BI alongside mapping applications such as map traversal via routing and relevant path finding algorithms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.tigergraph.com/home/" rel="noopener noreferrer"&gt;Official Info&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  5. MongoDB + graph-based lookup pipeline stage
&lt;/h2&gt;

&lt;p&gt;Another graph capable database would be MongoDB. Not only has the NoSQL schema flexibility but can be handled independently via its aggregation pipeline stage that can also be processed as a graph database.&lt;br&gt;
This is done by utilizing MongoDB's &lt;strong&gt;$graphLookup aggregation pipeline stage&lt;/strong&gt; so that it handles the relevant transformations directly on the underlying dataset.&lt;/p&gt;

&lt;p&gt;What is supported for this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All the high availability and optimization features that MongoDB cluster currently supports on the managed Atlas Cloud.&lt;/li&gt;
&lt;li&gt;All the administration panels and relevant DBMS for Windows, Linux provided by the same platform.&lt;/li&gt;
&lt;li&gt;What is currently supported in terms of CLI and self-hosting for MongoDB.&lt;/li&gt;
&lt;li&gt;Based on its online info, MongoDB supports key-value-pair matching per NoSQL document for building and returning a graph edge or a vertex via its graph-based aggregation pipeline. More info on this can be found &lt;a href="https://www.mongodb.com/resources/basics/databases/mongodb-graph-database" rel="noopener noreferrer"&gt;here.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even though MongoDB is good for handling key-value pairs in a graph-traversal manner for NoSQL documents it is still not a fully supported graph database schema. An additional enhancement is the use of labels to tag multiple nodes together to make node matching easier and more in-depth.&lt;/p&gt;

&lt;p&gt;There is also recently added extra support for out-of-the box connectivity with a graphQL enabled database and this is also stated in the &lt;a href="https://www.mongodb.com/developer/technologies/graphql/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;. Also Mongo Atlas Vector search is supported on managed &lt;a href="https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-overview/" rel="noopener noreferrer"&gt;MongoDB Atlas instances.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;u&gt;&lt;strong&gt;General Info&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
&lt;strong&gt;Important features:&lt;/strong&gt; All features currently supported by MongoDB and additional CLI tools and administration panel and software. A vast knowledge base but not too informative on how to use graphLookups in-depth and for real-world test cases.&lt;br&gt;
&lt;strong&gt;Where is applicable:&lt;/strong&gt; Most types of applications that require graph-based capabilities with a backend that currently runs on NoSQL infrastructure. Not to be recommended for more high level AI or ML frameworks and AI models as it does not support a lot of built-in graph handling features out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.mongodb.com/resources/basics/databases/mongodb-graph-database" rel="noopener noreferrer"&gt;Official Info&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  6. Azure CosmosDB for Apache Gremlin
&lt;/h2&gt;

&lt;p&gt;One of the top fully cloud hosted options for graph databases would be Apache Gremlin, managed directly on Azure Cloud.&lt;br&gt;
It is included as part of the NoSQL cloud hosted Cosmos DB that supports direct graph data structures handling. Apache Gremlin's engine is based on Apache Tinkerpop and has its own graph query language named &lt;em&gt;'Gremlin Query Language'.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The main advantage of being a part of Cosmos DB is that is fully integrated with Azure Cloud and the benefits that come with it. These include full Azure CloudShell interaction and usage for scripting with Gremlin directly on the cloud as well as all the benefits you get from running as a managed DaaS Azure resource.&lt;/p&gt;

&lt;p&gt;SDKs and scripting languages supported on Azure so far are Java, Python and .NET with good amount of examples in their online documentation.&lt;br&gt;
Some small open-source only community templates are available also for direct Gremlin Tinkerpop self-hosting via Docker. Another good feature that Gremlin graph uses on Azure Cloud, is that it can perform bulk data ingestion with it's &lt;a href="https://devblogs.microsoft.com/cosmosdb/introducing-bulk-support-in-the-net-sdk/" rel="noopener noreferrer"&gt;bulk execution library.&lt;/a&gt; Although this only works via a &lt;a href="https://learn.microsoft.com/en-us/azure/cosmos-db/gremlin/bulk-executor-dotnet" rel="noopener noreferrer"&gt;built-in .NET library&lt;/a&gt; and takes some prerequisites such as Maven/OpenJDK Gremlin API access towards your database.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;u&gt;&lt;strong&gt;General Info&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
&lt;strong&gt;Important features:&lt;/strong&gt; Fully managed web browser scripting environment via Azure CloudShell, huge support base by both Microsoft and open source Apache side and also a decent amount of languages and corresponding SDKs.&lt;br&gt;
&lt;strong&gt;Where is applicable:&lt;/strong&gt; General purpose graph-based features for multiple case scenarios and usages. These can be: map-based path-finding or routing for geospatial applications, ranking or recommendation engines, social network interactions and sentiment analysis for social network apps. Because of the built-in MS capabilities on Azure, can also be used for MLOps, DevOps in larger development teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/cosmos-db/gremlin/introduction#introduction-to-graph-databases" rel="noopener noreferrer"&gt;Official Info&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; Using a traditional relational database schema as a graph database without built-in features. In checking the following &lt;a href="https://stackoverflow.com/questions/18584598/how-to-persist-a-graph-data-structure-in-a-relational-database" rel="noopener noreferrer"&gt;online example&lt;/a&gt; and another more detailed &lt;a href="https://stackoverflow.com/questions/70491644/relational-schema-for-a-book-graph" rel="noopener noreferrer"&gt;here&lt;/a&gt;, this is the most time-consuming way to use as a last resort if creating a graph schema is a must for your application.&lt;br&gt;
This more challenging approach, involves mapping the nodes and edges to the corresponding key of a relational table so that a pointer record indicates the location (and direction) of the next node in the graph-like structure. This is usually performed in a &lt;strong&gt;&lt;code&gt;from -&amp;gt; to&lt;/code&gt;&lt;/strong&gt; layout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;WARNING - This is only useful if you really must persist graph data in a conventional database schema and there is no other option. Do not count on this for production usage.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;  &lt;br&gt;
This is my &lt;strong&gt;exhaustive listing&lt;/strong&gt; of graph-based database features and relevant usage. Feel free to provide other ideas/tech stacks or constructive criticism where needed.&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>db</category>
      <category>apollographql</category>
      <category>graphdb</category>
    </item>
    <item>
      <title>The top 8 headless CMS with self-hosting options.</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Sun, 16 Mar 2025 16:54:44 +0000</pubDate>
      <link>https://dev.to/chrdek/the-top-8-headless-cms-with-self-hosting-options-13jn</link>
      <guid>https://dev.to/chrdek/the-top-8-headless-cms-with-self-hosting-options-13jn</guid>
      <description>&lt;p&gt;In most modern web application or web page setups, there is an increasing trend in managing vast amount of growing and complicated content. Mostly centralized in web-based infrastructures, the heavy usage of real-time updates are handled by a CMS or similar service.&lt;br&gt;
Aside from that, most modern web apps can usually include a.i. features such as a chatbot or an a.i. assisted search to add better user experience in the overall website design.&lt;/p&gt;

&lt;p&gt;As data structures complexity of a website grows and demands for a.i. features are becoming more popular, it is noticed that most developers will utilize a graph-based Api alongside a headless CMS to speed-up the flexibility and maintainability of their content.&lt;br&gt;
Sometimes this also helps in adding a.i. features in their websites with minimal hassle and long-term changes.&lt;/p&gt;

&lt;p&gt;So, in web application building most web developers might prefer to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have all content easily managed and flexibly centralized via a headless CMS.&lt;/li&gt;
&lt;li&gt;Have a graph DB backend for easily exposing standard functionality such as login and registration and also extended features that require graph-based capabilities to integrate with such as, a.i. applications or external a.i. service calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the reasons stated above, here are the top 8 options that -in my opinion- gain the most interest while setting up a headless CMS with &lt;strong&gt;self-hosting options&lt;/strong&gt; for a portfolio site:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: There are many different Headless CMS options online, but I will only be focusing on the ones that support self-hosting and simplify deployments for the average developer when setting up a website, but also offer the necessary complexity when you require something more advanced.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Strapi
&lt;/h2&gt;

&lt;p&gt;One popular headless CMS for Node.js /React or most javascript-based web apps is strapi. It includes seamless admin panel integration with Gatsbyjs headless self-hosted plan and 1-click deployment to get you started easily to sync changes from gatsbyjs webapp to strapi.&lt;/p&gt;

&lt;p&gt;Also, supports direct cloud-to-local deployment via CLI or docker deployment (direct local machine node.js install or docker). These are the two main deployment options stated on the official website.&lt;/p&gt;

&lt;p&gt;Another plus for self-hosting is the low-grade hardware required to run strapi on. This is provided on their official documentation and shown below:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hardware&lt;/th&gt;
&lt;th&gt;Recommended&lt;/th&gt;
&lt;th&gt;Minimum&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;2+ cores&lt;/td&gt;
&lt;td&gt;1 core&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;4GB+&lt;/td&gt;
&lt;td&gt;2GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk&lt;/td&gt;
&lt;td&gt;32GB+&lt;/td&gt;
&lt;td&gt;8GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Minimum local H/W allow it to run even in a Raspberry Pi v2 Linux environment which is also nice.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Links&lt;/em&gt;&lt;br&gt;
&lt;a href="https://strapi.io/pricing-self-hosted" rel="noopener noreferrer"&gt;Source 1&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.strapi.io/cloud/cli/cloud-cli#strapi-link" rel="noopener noreferrer"&gt;Source 2&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.gatsbyjs.com/guides/strapi/" rel="noopener noreferrer"&gt;Source 3&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  2. TinaCMS
&lt;/h2&gt;

&lt;p&gt;Another popular option for self-hosting customizable CMS is TinaCMS. It allows a fully Node.js compliant backend with separated build and configurations for GraphQL data layer handling.  Can be easily deployed with 1-click on VercelApp, Netlify or any other external serverless environment by using a Next.js preset app for this specific purpose.&lt;/p&gt;

&lt;p&gt;Overall, it has some limitations and does not include a docker container option officially. &lt;/p&gt;

&lt;p&gt;A good plus is the 'local mode' vs 'production mode' just in case you need to switch your content locally on your machine for local development. Note that: Your entire codebase will still be required to be on github for self-hosting which is fully interactable with everything supported by TinaCMS.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Links&lt;/em&gt;&lt;br&gt;
&lt;a href="https://tina.io/docs/self-hosted/overview" rel="noopener noreferrer"&gt;Source 1&lt;/a&gt;&lt;br&gt;
&lt;a href="https://tina.io/docs/self-hosted/overview#how-does-self-hosting-work" rel="noopener noreferrer"&gt;Source 2&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  3. PayloadCMS
&lt;/h2&gt;

&lt;p&gt;In a similar concept, Payload CMS is another good option &lt;strong&gt;for e-commerce&lt;/strong&gt; that has a very decent UX as it comes to the CMS front-end.&lt;/p&gt;

&lt;p&gt;It allows for a vast amount of configuration and UI changes via its WordPress-like front-end. In addition to that, it supports extra built-in features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fine-grained access controls for standardized user accounts.&lt;/li&gt;
&lt;li&gt;Authentication methods such as pre-login, post-login registration scenarios, JWT and mainly everything that is required by a standard e-commerce grade site.&lt;/li&gt;
&lt;li&gt;Out-of-the-box CSRF and HTTP-Only cookie headers protection.&lt;/li&gt;
&lt;li&gt;Web app templates for ready made solutions supporting MongoDB, PostgreSQL with relevant data adapters.&lt;/li&gt;
&lt;li&gt;Built-in Mime/type and localized file upload support that also includes relevant access controls for all types of files. Extended behavior is achieved with additional storage adapters for remote uploads that interact with &lt;em&gt;Google GCP&lt;/em&gt;, &lt;em&gt;AWS S3&lt;/em&gt;, &lt;em&gt;Vercel Blob Storage&lt;/em&gt; or &lt;em&gt;MS Azure Blob Storage&lt;/em&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main upside is that your code can be self-hosted in any sort of NodeJS environment and also supports serverless Vercel deployment when ported as a Next.js webapp that is currently supported.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Links&lt;/em&gt;&lt;br&gt;
&lt;a href="https://payloadcms.com/posts/blog/introducing-payload-2021s-node-react-headless-cms-for-javascript-developers#blog" rel="noopener noreferrer"&gt;Source 1&lt;/a&gt;&lt;br&gt;
&lt;a href="https://payloadcms.com/docs/authentication/overview" rel="noopener noreferrer"&gt;Source 2&lt;/a&gt;&lt;br&gt;
&lt;a href="https://payloadcms.com/docs/upload/storage-adapters" rel="noopener noreferrer"&gt;Source 3&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  4. BudiBase
&lt;/h2&gt;

&lt;p&gt;In terms of flexibility of deployment, budibase may also be a good cms alternative. &lt;br&gt;
Even though not the most intuitive CMS front-end and not as scalable, it includes many other interesting features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-database direct support.&lt;/strong&gt; Currently supporting csv files, PostgreSQL, FireBase, MongoDB, mariaDB and MS SQL Server as directly targeted data source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow automation by direct integration&lt;/strong&gt; with various services such as Slack, Jira, Stripe, Discord for mass CMS-relevant operational notifications and other tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple self-hosting deployment options&lt;/strong&gt; such as docker, kubernetes, docker-compose, Ansible, DigitalOcean (cloud VPS), Linode (cloud VPS) and many others. Instructions also include a prebuilt ARM docker template for Azure deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another feature of budibase CMS is its highly detailed documentation for its also equally complicated self-hosting set of instructions to follow for most cases.&lt;/p&gt;

&lt;p&gt;It also includes an &lt;a href="https://docs.budibase.com/reference/appcreate" rel="noopener noreferrer"&gt;interactive API-documentation&lt;/a&gt; in its website to be able to view the actual Api calls and respective responses which is cool.&lt;/p&gt;

&lt;p&gt;Nonetheless, its &lt;em&gt;highly detailed documentation&lt;/em&gt; and real-time Api online playground make it a great all-around option for most web developers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Links&lt;/em&gt;&lt;br&gt;
&lt;a href="https://budibase.com/" rel="noopener noreferrer"&gt;Source 1&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.budibase.com/docs/hosting-methods" rel="noopener noreferrer"&gt;Source 2&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/budibase/budibase" rel="noopener noreferrer"&gt;Source 3&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  5. Directus
&lt;/h2&gt;

&lt;p&gt;The directus option is probably the &lt;strong&gt;fastest in terms of deployment&lt;/strong&gt; (90 seconds or less for cloud deployment) but with more limited self-hosting and other options.&lt;br&gt;
As it currently supports docker-based deployment as a private server option, this is made very fast and in a simple three-step process as stated on their website. &lt;br&gt;
&lt;em&gt;Note: It still involves a prerequisite of docker and docker-compose to quickly get a directus cms app online.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nonetheless, some added set of features such as project data workflow automation -via emails and notifications- and also built-in API and simple user RBAC and Access Controls make it into an interesting CMS option.&lt;/p&gt;

&lt;p&gt;Overall, it is good if you require a fast/functional deployment of your Node.js webapp either by self-host or cloud hosting option.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Links&lt;/em&gt;&lt;br&gt;
&lt;a href="https://directus.io/docs/getting-started/create-a-project" rel="noopener noreferrer"&gt;Source 1&lt;/a&gt;&lt;br&gt;
&lt;a href="https://directus.io/docs/getting-started/create-a-project#docker-installation" rel="noopener noreferrer"&gt;Source 2&lt;/a&gt;&lt;/p&gt;



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

&lt;p&gt;One of the most popular options for hosting web apps and supporting many deployments on the Vercel cloud (Testing, production) is Next. The cloud option is currently the most popular with tons of github repos supported.&lt;br&gt;
But fortunately since this blog post is about self-hosting options the top 3 relevant styles for Next.js are available here and as displayed below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Direct Node.js provider deployment.&lt;/li&gt;
&lt;li&gt;Docker image deployment (helpful examples for webapp included online).&lt;/li&gt;
&lt;li&gt;Static HTML Export for direct SPA or static website hosting on a personal server such as AWS S3, nginx, apache or other.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most interesting feature of Next.js self-hosted apps is the built-in caching it supports. Also integrated Cdn (header-specific) support for hosted content and zero-configuration deployment for middleware-based scenarios supported by &lt;code&gt;next start&lt;/code&gt; is another great feature.&lt;/p&gt;

&lt;p&gt;All of the above are also included on their website as part of the self-hosted options documentation. Using Next.js as a headless CMS might not be a good option since it does not include a fully fledged cms UI or other similar features.&lt;br&gt;
On the other hand, it has good content caching and transparent data-handling capabilities. With that said, this still turn it into a good candidate to be added in the list of headless CMS hosting options.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Links&lt;/em&gt;&lt;br&gt;
&lt;a href="https://nextjs.org/docs/app/building-your-application/deploying#self-hosting" rel="noopener noreferrer"&gt;Source 1&lt;/a&gt;&lt;br&gt;
&lt;a href="https://nextjs.org/docs/app/building-your-application/optimizing/open-telemetry#self-hosting" rel="noopener noreferrer"&gt;Source 2&lt;/a&gt;&lt;br&gt;
&lt;a href="https://vercel.com/templates/next.js" rel="noopener noreferrer"&gt;Source 3&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  7. ApolloGraphQL on Apollo GraphOS + Sandbox IDE
&lt;/h2&gt;

&lt;p&gt;One of the high-end options for a headless cms that is also enterprise-ready for larger projects is ApolloGraphQL. It transparently integrates and supports GraphQL API, REST API, with proper management APIs.&lt;/p&gt;

&lt;p&gt;It has a highly scalable and transparent data routing layer (GraphOS Router). This allows for flexible schema allocation making it ideal for distributed schema design approaches.&lt;/p&gt;

&lt;p&gt;Aside from having &lt;strong&gt;a large knowledge base and support forums&lt;/strong&gt; in addition to the detailed documentation, it includes the following major highlights (as a headless cms techstack):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Apollo Sandbox IDE:&lt;/strong&gt; &lt;br&gt;
A full server-based html sandbox environment that also interacts as a direct server deployment tool. Aside from being a great in-browser IDE with a broad range of features, Apollo Sanbox runs in a self-hosted local environment that supports data schema visualizations with relevant workflows.&lt;br&gt;
This includes GraphQL schema diffs, checks and visual query execution plans as core features of this IDE.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GraphOS Router + Apollo Connectors:&lt;/strong&gt;&lt;br&gt;
Easily utilized federated schema routing /connections allows for direct schema manipulation as a separate layer on top of multiple APIs on self-hosted enterprise level apps.&lt;br&gt;
This allows for low-code to no-code infrastructure setup alongside maximum productivity for devs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kubernetes + Docker GraphOS Router Deployments:&lt;/strong&gt;&lt;br&gt;
Apparently only docker or kubernetes containerized self-hosting is supported for GraphOS Router or Apollo Router Core. Inclusive features also supporting these environments are &lt;em&gt;&lt;strong&gt;Prometheus and OpenTelemetry Protocol-backed&lt;/strong&gt;&lt;/em&gt; metrics as part of the insight gathering process for active container platform.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As an enterprise-level option the Apollo IDE  full setup alongside a self-hosted instance of your GraphOS Router and data handling layer, is a viable option for most SMEs or personal projects.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Links&lt;/em&gt;&lt;br&gt;
&lt;a href="https://www.apollographql.com/docs/graphos/routing/self-hosted/resource-management" rel="noopener noreferrer"&gt;Source 1&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.apollographql.com/graphos/apollo-connectors" rel="noopener noreferrer"&gt;Source 2&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.apollographql.com/blog/how-to-use-apollo-sandbox-on-your-localhost" rel="noopener noreferrer"&gt;Source 3&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.apollographql.com/federation" rel="noopener noreferrer"&gt;Source 4&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  8. Sveltia-CMS
&lt;/h2&gt;

&lt;p&gt;Last but not least, a svelte-based cms called sveltia seems also very promising in terms of open-source simplified direct deployments.&lt;/p&gt;

&lt;p&gt;Being still under maintenance and fully supported by the open source community has its code base open for changes and improvements and continuously builds upon its current standards.&lt;br&gt;
Currently only two different cloud deployment types supported on &lt;em&gt;Netlify&lt;/em&gt; and on &lt;em&gt;Decap.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As it is fully Git-based, Sveltia headless CMS has also its drawbacks as part of your source still needs to be hosted in a github-based repo. This makes it a little bit less attractive option to devs that aim for external enterprise-ready client projects.&lt;/p&gt;

&lt;p&gt;The best most viable option for static site projects and simple test environments alongside directus would be sveltia since it is pretty simple to setup and run.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Links&lt;/em&gt;&lt;br&gt;
&lt;a href="https://github.com/sveltia/sveltia-cms" rel="noopener noreferrer"&gt;Source 1&lt;/a&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  BONUS - CLOUD HOSTING ONLY OPTIONS:
&lt;/h3&gt;

&lt;p&gt;Some other cloud-only hosted headless CMS options for people that want their codebase to be hosted on someone else's server are also available.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.contentful.com/faq/backup-security-and-hosting/#can-i-self-host-download-contentful" rel="noopener noreferrer"&gt;Contentful&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.storyblok.com/pricing" rel="noopener noreferrer"&gt;Storyblok&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://craftcms.com/cloud" rel="noopener noreferrer"&gt;CraftCms&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>graphql</category>
      <category>apollographql</category>
      <category>cms</category>
      <category>tinacms</category>
    </item>
    <item>
      <title>How do I use ChatGPT as a developer? Top 10 + 1 best usages.</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Sun, 23 Feb 2025 15:08:00 +0000</pubDate>
      <link>https://dev.to/chrdek/how-do-i-use-chatgpt-as-a-developer-top-10-1-best-usages-m1o</link>
      <guid>https://dev.to/chrdek/how-do-i-use-chatgpt-as-a-developer-top-10-1-best-usages-m1o</guid>
      <description>&lt;p&gt;In terms of computer software engineering, code AI or the so-called copilot coding apps (or what I like to call code companion Gen AI) are becoming more and more useful for everyone that wants to become a developer or improve their current programming skills.&lt;/p&gt;

&lt;p&gt;The problem with that is that if you do not get what Generative AI with an LLM does in terms of coding, you will end up hating it and with that the unwanted frustration and bad code produced.&lt;/p&gt;

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

&lt;h4&gt;
  
  
  An overly-simplified description of how an LLM works is shown below:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The main &lt;strong&gt;Generative&lt;/strong&gt; part of the LLM gets fed with info from user input in the form of a generic or specific question/sentence. In that sentence the words are tokenized, means that are split and mapped to a linear 1D data structure (array, list).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;The text is then mapped to the corresponding values of words by order of which those have been tokenized (eg: 1,2,3..etc) so these are fed to the &lt;strong&gt;Pre-Trained&lt;/strong&gt; A.I. models and then the textual A.I. language model will try to &lt;strong&gt;Transform&lt;/strong&gt; input words to the statistical analogous using statistic series classification in the form of a set of numeric values (AI model weights).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;These values indicate and inform the Gen AI process of the used words importance (per LLM subject or category) so that it is able to respond with the closest answer to the naturally-set question - &lt;a href="https://blog.google/products/search/search-language-understanding-bert/" rel="noopener noreferrer"&gt;this is similar to Google's BERT.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This process also gives the name of the most well known LLM used aka &lt;strong&gt;GPT&lt;/strong&gt; (or Generative Pre-Trained Transformer) that most people use for nearly every purpose.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;u&gt;In my opinion, this entire process is closely similar in how Google's &lt;a href="https://developers.google.com/search/docs/appearance/ranking-systems-guide" rel="noopener noreferrer"&gt;site-ranking&lt;/a&gt; algorithm works to rank -and- add the top 10  most relevant sites per user's search prompt.&lt;br&gt;
 &lt;br&gt;
Most basic thing that differs is the real-time data updates and interaction from Google instead of ChatGPT's pre-defined data.&lt;br&gt;
&lt;/u&gt;&lt;/p&gt;

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

&lt;p&gt;Replacing a Google search query with ChatGPT, that would be the equivalent to having 20 Chrome tabs open while googling on the web and writing up notes based on your top 3-4 most helpful sites that are closest to your subject.&lt;br&gt;
The complete set of notes written will be much more similar to a response from ChatGPT.&lt;br&gt;
&lt;em&gt;Try it yourself.&lt;/em&gt; Many equivalent versions of text and subjects generation are available online. A fun example will also be &lt;a href="https://lurkertech.com/corpspeak/" rel="noopener noreferrer"&gt;this recreational site&lt;/a&gt; and &lt;a href="https://www.bullshitgenerator.com/ai-bullshit-generator/" rel="noopener noreferrer"&gt;this also.&lt;/a&gt;&lt;br&gt;
 &lt;br&gt;
&lt;/p&gt;

&lt;br&gt;
What this means in terms of using ChatGPT for general questions is that the phrasing of the sentence must be correct, the concept is added as a top priority in your phrase or sentence and also in some cases punctuation marks indicating pauses in a sentence or continuation from a previous sentence if not used correctly might produce different results of the ones expected.&lt;br&gt;
 &lt;br&gt;

&lt;br&gt;
What this means, when you use ChatGPT for coding or when generating or adding code as a software developer, is that to produce the most appropriate result both you as a user and the text prompt must share the same amount of information so that the appropriate result is produced.&lt;br&gt;
This can easily be done in the form of a &lt;strong&gt;'paired programming'&lt;/strong&gt; session by noticing each others bugs and underlying code.&lt;br&gt;


&lt;p&gt;In order to achieve this, you need to have a coding infrastructure with standards pre-set, all classes compiling and running properly with/without any UI parts and some sample code to start with to use as input for your questions.&lt;br&gt;
Using this method can achieve the necessary enhancements to your current coding style and infrastructure &lt;em&gt;and minimize&lt;/em&gt; &lt;strong&gt;BOTH errors and debugging time,&lt;/strong&gt; when lacking time, help or coding peers. This is without mentioning the time saved to trial-and-error new versions and checks on configuration files or missing SDKs and packages in your code.&lt;/p&gt;

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

&lt;p&gt;As an added bonus to this, here is a listing of the &lt;u&gt;top 10 + 1 best possible use cases&lt;/u&gt; of &lt;strong&gt;ChatGPT for improving software developer work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  ChatGPT top 10 +1 uses for a software developer:
&lt;/h3&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h4&gt;
  
  
  #1.
&lt;/h4&gt;

&lt;p&gt;Generate a nice creative 404 static web page for the blocked responses of your web based solution. Easiest thing to be done even if you lack creativity but are good with words and story-making.&lt;/p&gt;
&lt;h4&gt;
  
  
  #2.
&lt;/h4&gt;

&lt;p&gt;Write a framework or an API of a programming language while also applying fast-paced learning on the programming platform you already work on. This can be used as a learning tool for both senior and junior levels.&lt;/p&gt;
&lt;h4&gt;
  
  
  #3.
&lt;/h4&gt;

&lt;p&gt;Text transcription as a software language or translating from one software development language to another. This can be used if a missing library in python needs to be in-place to handle similar code to your current code base that only supports JS packages. This also applies to IT administrators just in case they need to update some older automation scripts on Windows/Linux environment to PowerShell or Python for cross-compatibility or vice-versa. Some combinations of this &lt;strong&gt;(from&amp;lt;--&amp;gt;to)&lt;/strong&gt; are shown below:&lt;br&gt;
&lt;strong&gt;Batch or Bash &amp;lt;--&amp;gt; To PowerShell&lt;br&gt;
Batch &amp;lt;--&amp;gt; Python&lt;br&gt;
PowerShell &amp;lt;--&amp;gt; Bash or Python&lt;/strong&gt;&lt;br&gt;
This can be easily done but I would not rely on it too much for large and complicated IT infrastructures.&lt;/p&gt;
&lt;h4&gt;
  
  
  #4.
&lt;/h4&gt;

&lt;p&gt;Use it as a data generator Tool (Json struct, Table struct). Some alternatives are to use POCO class generators built-in to Visual Studio or other Visual Studio extensions that first need to be downloaded/configured accordingly. Sample usage in ChatGPT shown below.&lt;/p&gt;

&lt;p&gt;Chat prompt:&lt;br&gt;
&lt;code&gt;Provided the description of a table of a pet dog below, response with the corresponding layout as a JSON object, a Csharp class and as an SQL create table statement. Note: Add the most appropriate data types per column definition so those can be used in a codebase or IDE.&lt;br&gt;
Pet Dog Table Columns:&lt;br&gt;
ID&lt;br&gt;
Name&lt;br&gt;
Breed&lt;br&gt;
Age&lt;br&gt;
LastVetVisit&lt;br&gt;
HasIdentificationTag&lt;br&gt;
DangerousBreed&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Chat response:&lt;br&gt;
&lt;code&gt;Here’s the requested information in JSON, C# class, and SQL format:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;JSON Layout:&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"PetDog"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Buddy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Breed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Golden Retriever"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"LastVetVisit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-06-15T00:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"HasIdentificationTag"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DangerousBreed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PetDog&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Breed&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt; &lt;span class="n"&gt;LastVetVisit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;HasIdentificationTag&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;DangerousBreed&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;PetDog&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Breed&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Age&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;CHECK&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;LastVetVisit&lt;/span&gt; &lt;span class="nb"&gt;DATETIME&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;HasIdentificationTag&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;DangerousBreed&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;This structure ensures proper data integrity and usability in a codebase or IDE. Let me know if you need modifications! 🚀&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  #5.
&lt;/h4&gt;

&lt;p&gt;Can also be used to help with web-based API test cases creation that can be used via Postman, curl, SoapUI or any other client-side test framework. Chat-Code pair generated below:&lt;/p&gt;

&lt;p&gt;Chat prompt:&lt;br&gt;
&lt;code&gt;Create a sample HTTP Bearer Token Request body via POST to use in an API endpoint that retrieves a set of books by genre or category. Do not write any code usage as client side examples just reply with the appropriate JSON request body and the sample API endpoint style to use.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Chat response:&lt;br&gt;
&lt;code&gt;POST https://api.example.com/books/filter&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer YOUR_ACCESS_TOKEN  
Content-Type: application/json  
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"genre"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Science Fiction"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dystopian"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"offset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"title"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  #6.
&lt;/h4&gt;

&lt;p&gt;Use it to reverse-create Object to Database Table columns and vice-versa. An alternative would also be Entity Framework Designer or Command Line usage of any code generation executable provided by Microsoft or other company (Other cmd line tools for schema generation include: &lt;em&gt;wsdl.exe&lt;/em&gt;, &lt;em&gt;xsd.exe&lt;/em&gt; which are provided with Visual Studio's .NET platform). Following is an example that covers most usages mentioned above:&lt;/p&gt;

&lt;p&gt;Chat prompt:&lt;br&gt;
&lt;code&gt;Convert the following json to its corresponding xsd schema:&lt;br&gt;
[{&lt;br&gt;
        "full name": "Leticia Brekke",&lt;br&gt;
        "address": {&lt;br&gt;
            "street": "45792 D'Amore River",&lt;br&gt;
            "city": "Ouésso"&lt;br&gt;
        }&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        "full name": "Jay Fay",&lt;br&gt;
        "address": {&lt;br&gt;
            "street": "5506 Koepp Run",&lt;br&gt;
            "city": "Alofi"&lt;br&gt;
        }&lt;br&gt;
    },&lt;br&gt;
...other json objects here..]&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Chat response:&lt;br&gt;
&lt;code&gt;Here is the corresponding XSD schema for your JSON structure:&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;xs:schema&lt;/span&gt; &lt;span class="na"&gt;xmlns:xs=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema"&lt;/span&gt; &lt;span class="na"&gt;elementFormDefault=&lt;/span&gt;&lt;span class="s"&gt;"qualified"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;xs:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"People"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;xs:complexType&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;xs:sequence&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;xs:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Person"&lt;/span&gt; &lt;span class="na"&gt;maxOccurs=&lt;/span&gt;&lt;span class="s"&gt;"unbounded"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;xs:complexType&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;xs:sequence&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;xs:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"FullName"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xs:string"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;xs:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Address"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;xs:complexType&amp;gt;&lt;/span&gt;
                                    &lt;span class="nt"&gt;&amp;lt;xs:sequence&amp;gt;&lt;/span&gt;
                                        &lt;span class="nt"&gt;&amp;lt;xs:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Street"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xs:string"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                                        &lt;span class="nt"&gt;&amp;lt;xs:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"City"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xs:string"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                                    &lt;span class="nt"&gt;&amp;lt;/xs:sequence&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;/xs:complexType&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;/xs:element&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/xs:sequence&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/xs:complexType&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/xs:element&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/xs:sequence&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/xs:complexType&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/xs:element&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/xs:schema&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  #7.
&lt;/h4&gt;

&lt;p&gt;Use it in the form of basic algebraic problems or (solve-for-X solve-for-Y problems) to enhance or even debug the behavior of a UI design in a front-end component. This works great with Reactive and dynamic components and frameworks that are mainly JavaScript-based.&lt;br&gt;
A sample workflow on how to achieve that would be to:&lt;br&gt;
&lt;strong&gt;Have :&lt;br&gt;
X = "the source code of your UI part" or "faulty behavior of source code"&lt;br&gt;
Answer = "the wanted behavior of the UI part"&lt;/strong&gt;&lt;br&gt;
An example would be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I have the following js ui design "X" and want to map the nested JS object to the following Html attributes of my template, what are the missing parts that need to be implemented based on this code mentioned?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What &lt;em&gt;cannot&lt;/em&gt; be done easily is for the A.I. chat prompt to understand &lt;strong&gt;ONLY by using descriptive text&lt;/strong&gt; a misalignment of a div or why a text inside a nested  div does not change. &lt;br&gt;
The &lt;strong&gt;HTML code needs to also be provided&lt;/strong&gt; and even then, the prompt does not see-through other misalignment UI problems that might arise after changing something.&lt;/p&gt;
&lt;h4&gt;
  
  
  #8.
&lt;/h4&gt;

&lt;p&gt;Generate a known codebase folder structure of a framework/SDK. Examples include: Visual Studio  VB .NET, C# or ASP .NET, Node.js code folder directory solutions. This is made available as in the ChatGPT example below:&lt;/p&gt;

&lt;p&gt;Chat prompt:&lt;br&gt;
&lt;code&gt;Create a basic folder directory structure for a node.js visual studio 2019 solution.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Chat response:&lt;br&gt;
&lt;code&gt;For a Node.js project in Visual Studio 2019, a typical folder directory structure would look like this:&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/MyNodeProject       &lt;span class="c"&gt;# Root project directory&lt;/span&gt;
│── /bin             &lt;span class="c"&gt;# Output files (if needed)&lt;/span&gt;
│── /node_modules    &lt;span class="c"&gt;# Installed npm packages&lt;/span&gt;
│── /public          &lt;span class="c"&gt;# Static files (CSS, JS, images)&lt;/span&gt;
│── /routes          &lt;span class="c"&gt;# Route handlers&lt;/span&gt;
│── /views           &lt;span class="c"&gt;# Templating engine files (if using e.g., EJS, Pug)&lt;/span&gt;
│── /src             &lt;span class="c"&gt;# Source files (alternative to /routes, /controllers)&lt;/span&gt;
│   ├── /controllers &lt;span class="c"&gt;# Controller logic (if following MVC pattern)&lt;/span&gt;
│   ├── /models      &lt;span class="c"&gt;# Database models (if using MongoDB, Sequelize, etc.)&lt;/span&gt;
│── /config          &lt;span class="c"&gt;# Configuration files (DB connections, environment settings)&lt;/span&gt;
│── /tests           &lt;span class="c"&gt;# Test files (Jest, Mocha, etc.)&lt;/span&gt;
│── /logs            &lt;span class="c"&gt;# Log files&lt;/span&gt;
│── .env             &lt;span class="c"&gt;# Environment variables&lt;/span&gt;
│── .gitignore       &lt;span class="c"&gt;# Git ignore file (node_modules, logs, etc.)&lt;/span&gt;
│── app.js           &lt;span class="c"&gt;# Main application entry point (or server.js)&lt;/span&gt;
│── package.json     &lt;span class="c"&gt;# Project metadata and dependencies&lt;/span&gt;
│── package-lock.json &lt;span class="c"&gt;# Package lock file&lt;/span&gt;
│── README.md        &lt;span class="c"&gt;# Project documentation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Explanation of Key Directories&lt;br&gt;
bin/ – Holds compiled files or scripts (rarely needed).&lt;br&gt;
node_modules/ – Contains installed dependencies (auto-generated by npm/yarn).&lt;br&gt;
public/ – Stores static assets (CSS, JavaScript, images).&lt;br&gt;
routes/ – Defines route handlers for different parts of the application.&lt;br&gt;
views/ – Contains UI templates if using a templating engine like EJS or Pug.&lt;br&gt;
src/ – Can store main source files if you prefer a more modular structure.&lt;br&gt;
config/ – Holds environment configurations and database setup.&lt;br&gt;
tests/ – Includes unit and integration test files.&lt;br&gt;
.env – Manages environment variables (e.g., database credentials, API keys).&lt;br&gt;
app.js – The main entry point of the application.&lt;br&gt;
This structure keeps your Node.js application well-organized, maintainable, and scalable in Visual Studio 2019. Let me know if you need adjustments for a specific framework like Express.js or NestJS. 🚀&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  #9.
&lt;/h4&gt;

&lt;p&gt;Another useful scenario would be to use it for combinatorial problems as most A.I. are good for making predictions and creating combinations very fast (See: Huge Computational Ability via GPU Clusters 🚀🚀).&lt;br&gt;
 &lt;br&gt;
This brings me to the following interesting subject usage in TDD (or Test-Driven-Development) where the developer analyzes first the tests provided with code and then creates the corresponding coding part to support such test capability.&lt;br&gt;
To be able to code using TDD via ChatGPT one can use it to produce a PICT-ogram (aka Pairwise-Independent-Combinatorial-Testing table) with the appropriate test case scenarios and relevant code. &lt;br&gt;
This process can be further enhanced by applying other rules such as fuzz testing/mutation testing based on the generated test cases provided.&lt;br&gt;
Not to mention the nice table-based markdown parts generated with that for our combinations table. &lt;/p&gt;

&lt;p&gt;Not to be forgotten, &lt;a href="https://github.com/microsoft/pict?tab=readme-ov-file" rel="noopener noreferrer"&gt;the alternative from MS official sources is MS-PICT tool&lt;/a&gt; that does this job also in an executable.&lt;br&gt;
 &lt;br&gt;
The entire Text Prompt-ChatGPT interaction for this is provided below:&lt;/p&gt;

&lt;p&gt;Chat prompt #1:&lt;br&gt;
&lt;code&gt;I need to add a set of combinatorial UI tests in a Chai.js testing framework. Please provide a sample Pictogram to get started with my solution tests.&lt;br&gt;
Some functionality included in the testing is:&lt;br&gt;
Get info from DB&lt;br&gt;
Check for DB connectivity&lt;br&gt;
May or May not retrieve error response during handling of input.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Chat response #1:&lt;br&gt;
&lt;code&gt;For testing combinatorial scenarios in Chai.js, you can use a pictogram or decision table to systematically cover different possible input combinations. Below is a sample pictogram representing different test cases for your given functionalities:&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Pictogram for Combinatorial UI Testing
&lt;/h4&gt;

&lt;p&gt;Test Case   DB Connectivity     Get Info from DB    Error Handling Required?    Expected Outcome&lt;br&gt;
TC1 ✅ (Connected) ✅ (Data Found)    ❌ (No Error)  Data retrieved successfully&lt;br&gt;
TC2 ✅ (Connected) ❌ (No Data)   ✅ (Handles Error) "No Data Found" message&lt;br&gt;
TC3 ❌ (Disconnected)  ❌ (No Data)   ✅ (Handles Error) "DB Connection Failed" error&lt;br&gt;
TC4 ✅ (Connected) ❌ (No Data)   ❌ (No Error)  Empty response (possible issue)&lt;br&gt;
TC5 ❌ (Disconnected)  ✅ (Data Found)    ✅ (Handles Error) Unexpected state—Test should fail&lt;/p&gt;

&lt;p&gt;&lt;code&gt;These test cases can be implemented in Chai.js using Mocha as the test runner. Below is a sample Chai.js test script that validates different database response cases.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chai&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sinon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sinon&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../services/dbService&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Your DB logic&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Combinatorial UI Tests - Database Interactions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;dbStub&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;afterEach&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dbStub&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;dbStub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;restore&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;should retrieve data successfully when DB is connected and data exists&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;dbStub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dbService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;getInfoFromDB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;resolves&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User Data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;dbService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInfoFromDB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User Data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;should return 'No Data Found' when DB is connected but no data exists&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;dbStub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dbService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;getInfoFromDB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;resolves&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;dbService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInfoFromDB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;//Rest of the code is ommited...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Key Points:&lt;br&gt;
✅ Uses Sinon.js to stub/mock database responses&lt;br&gt;
✅ Covers all combinations from the pictogram&lt;br&gt;
✅ Handles error scenarios explicitly&lt;br&gt;
✅ Ensures robustness of UI handling for different DB states&lt;br&gt;
Would you like me to add more edge cases or improve the test structure? 🚀&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Chat prompt #2:&lt;br&gt;
&lt;code&gt;Generate a test case based on the sample Chai.js test-case below&lt;br&gt;
Chai.js partial file:   &lt;br&gt;
 it("should return empty response when DB is connected but no error handling is present", async function () {&lt;br&gt;
        dbStub = sinon.stub(dbService, "getInfoFromDB").resolves(undefined);&lt;br&gt;
        const result = await dbService.getInfoFromDB();&lt;br&gt;
        expect(result).to.be.undefined;&lt;br&gt;
    });&lt;br&gt;
Use fuzzy logic to generate the top 3 most closely relevant use-cases and include those in your response.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Chat response #2:&lt;br&gt;
&lt;code&gt;Here are three closely relevant test cases using fuzzy logic to expand on your original Chai.js test case:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Test Case 1: Ensure Proper Handling of Null Response&lt;br&gt;
This test checks if the function correctly handles null responses instead of undefined.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;should return null when DB returns null response&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;dbStub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dbService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;getInfoFromDB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;resolves&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;dbService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInfoFromDB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Test Case 2: Ensure Error Handling When DB Throws an Exception&lt;br&gt;
This test verifies that an error is thrown when the database service encounters an exception.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;should throw an error when DB service encounters an exception&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;dbStub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dbService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;getInfoFromDB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;throws&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Database connection failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;dbService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInfoFromDB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Test failed, no error thrown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;an&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Database connection failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Test Case 3: Ensure Proper Handling of Empty Object Response&lt;br&gt;
This test ensures that the function handles an empty object {} correctly.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;should return an empty object when DB returns an empty response&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;dbStub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dbService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;getInfoFromDB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;resolves&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;dbService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInfoFromDB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;an&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;that&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;is&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;These test cases cover different possible responses from the database service, ensuring robustness. Let me know if you need further refinements! 🚀&lt;/code&gt;&lt;br&gt;
 &lt;br&gt;
You can use this style to add up to a TDD environment whenever necessary or &lt;em&gt;if requirements and specs are unclear and not very well-refined.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  #10.
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;** ONLY EDUCATIONAL/DEMO USAGE **&lt;/strong&gt; Malicious payload generator, if you are being subtle is possible to be done but not good enough for use in an actual code environment. Best case you have a recursive loop or deadlock that halts part of a program or a web site and some obscure byte sequence that supposedly is injected to the application so that it breaks. Not the best use case example but good only for an informational demo.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;On the flip side of this, here is an example of securely encrypting a string of text by using standard AES-256 with a predefined key:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
 &lt;br&gt;
Chat prompt #1:&lt;br&gt;
&lt;code&gt;I need to securely encrypt the phrase "Wizard of google searches" with a key of 7yT73daeS3_9 using AES 256bit-GCM encryption. Set the response with encrypted text sequence. If data is insufficient or if you need more parameters to do this properly please start the response with "More parameters required" and add to the response.&lt;/code&gt;&lt;br&gt;
 &lt;br&gt;
Chat response #1:&lt;br&gt;
&lt;code&gt;More parameters required. AES-256-GCM encryption requires the following additional details:&lt;br&gt;
IV (Initialization Vector) – A unique, random 12-byte value for each encryption.&lt;br&gt;
AAD (Additional Authenticated Data) – Optional, but used for authentication.&lt;br&gt;
Tag Length – Typically 16 bytes for integrity verification.&lt;br&gt;
Please provide the IV (or let me generate a random one) and confirm if you have any preferences for AAD.&lt;/code&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;Chat prompt #2:&lt;br&gt;
&lt;code&gt;I need a random IV and AAD not required.&lt;/code&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;Chat response #2:&lt;br&gt;
&lt;code&gt;Here is the AES-256-GCM encrypted text sequence:&lt;br&gt;
S5YxhOjP+w4a+z9v9bXbpMWG2Glf1W6Np/F+tZt0vRbrhCtLtpaEWntAfkqOj2WAXIEl/s0=&lt;br&gt;
This base64-encoded string contains the IV, ciphertext, and authentication tag. Let me know if you need decryption instructions!​&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Interestingly enough, the prompt was kind enough to add the corresponding code in python in its answer analysis part. Somehow it justifies its own answer by also including a nice code block (shown below):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;Crypto.Cipher&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AES&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;Crypto.Random&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_random_bytes&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;

&lt;span class="c1"&gt;# Given parameters
&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;7yT73daeS3_9&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ljust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Ensure 256-bit key length by padding with null bytes
&lt;/span&gt;&lt;span class="n"&gt;plaintext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Wizard of google searches&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;# Generate a random 12-byte IV
&lt;/span&gt;&lt;span class="n"&gt;iv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_random_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Encrypt using AES-256-GCM
&lt;/span&gt;&lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MODE_GCM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;iv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ciphertext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encrypt_and_digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plaintext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Concatenate IV, ciphertext, and tag for transmission/storage
&lt;/span&gt;&lt;span class="n"&gt;encrypted_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;iv&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ciphertext&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;

&lt;span class="c1"&gt;# Encode as base64 for a readable format
&lt;/span&gt;&lt;span class="n"&gt;encrypted_b64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encrypted_data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Return encrypted text sequence
&lt;/span&gt;&lt;span class="n"&gt;encrypted_b64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h4&gt;
  
  
  #11.
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;** BONUS FUN USAGE ** If you have spare time and no other deadlines or for fast paced learning of interns/junior devs.&lt;/strong&gt; Get Dall-e to generate an appropriate image based on the code quality or level of complexity and guess what that code block represents. Input a block of code and generate a corresponding image on Dall-e to help you keep motivated or enhance your level of current knowledge (improve the visual parts of the image by improving code).&lt;br&gt;
&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finally, do not over rely on such development work since after all &lt;strong&gt;YOU ARE&lt;/strong&gt; the first contact point from the text prompt input to OpenAI datacenters that produce the code. If you produce good code, then all is good.&lt;br&gt;
In case you have logic errors that you have missed or previously inherited bugs from other codebases, then problems might start appearing.&lt;br&gt;
As they say in computing &lt;em&gt;the "Garbage-In-Garbage-Out" principle&lt;/em&gt; holds true in such a use case of ChatGPT, leading to unwanted code or other side effects. Overall, keep your code requests simple and to the point so you do not end-up doing more unnecessary odd jobs.&lt;br&gt;
 &lt;br&gt;
Stay alert so that you don't miss a comma or phrase while writing your GPT prompt and to avoid ending-up like the little guy in the image below.&lt;/p&gt;

&lt;p&gt;:-)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbi88mkewh8mp0j65kg17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbi88mkewh8mp0j65kg17.png" alt="ChatGPT" width="800" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>chatgpt</category>
      <category>webdev</category>
      <category>genai</category>
    </item>
    <item>
      <title>List of 6 most important things to consider for .env files</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Sat, 01 Feb 2025 13:02:00 +0000</pubDate>
      <link>https://dev.to/chrdek/list-of-6-most-important-things-to-consider-for-env-files-bmi</link>
      <guid>https://dev.to/chrdek/list-of-6-most-important-things-to-consider-for-env-files-bmi</guid>
      <description>&lt;p&gt;Most personal [and production-level] project's structure can easily become too complicated as time progresses during development. This leads to over-burdening the &lt;code&gt;.env&lt;/code&gt; file, which should be avoided during large project lifecycles that can last for months.&lt;/p&gt;

&lt;p&gt;Nearly all modern IDEs will try to automatically manage &lt;code&gt;.env&lt;/code&gt; settings for you. This is only done both for flexibility and security reasons, and there are still things that need to be considered to properly utilize this important file in your development environment.&lt;/p&gt;

&lt;p&gt;This lead me to make a list from both various sources and personal opinions that best describes the top 6 proper use cases for managing an .env file.&lt;/p&gt;




&lt;h3&gt;
  
  
  1 .env - Permissions:
&lt;/h3&gt;

&lt;p&gt;The standard permissions for an environment variable file used in most web application solutions like: React.js or Laravel or even Node.js should not be accessible outside &lt;strong&gt;/public.&lt;/strong&gt;&lt;br&gt;
Aside from being hidden by default in linux, the read-write access to the environment file is already pre-set in both linux or windows-based deployment setups by the corresponding coding platform that handles it.&lt;/p&gt;

&lt;p&gt;This is also-known-as &lt;strong&gt;the default&lt;/strong&gt; that your IDE development environment auto-generates for you on install.&lt;/p&gt;

&lt;p&gt;In case that this &lt;strong&gt;does not happen&lt;/strong&gt; a good ruleset to manually secure it would be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To have root-only owner access to the file.&lt;/li&gt;
&lt;li&gt;To set the group of that permission on the web server's directory (www-root, www-data for Ubntu/Debian).&lt;/li&gt;
&lt;li&gt;Enable permissions set to 640 on that .env file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a production environment, the permissions of the .env file are the corresponding set of the commands below:&lt;br&gt;
&lt;code&gt;chmod 400&lt;/code&gt; or &lt;code&gt;chmod 440&lt;/code&gt;. &lt;br&gt;
Also access must be even further blocked on the webserver side via the &lt;code&gt;.htaccess&lt;/code&gt; file.&lt;/p&gt;
&lt;h3&gt;
  
  
  2 .env - Source control:
&lt;/h3&gt;

&lt;p&gt;It is not recommended by anyone to add an &lt;code&gt;.env&lt;/code&gt; file to github  or any other publicly accessible source control services.&lt;/p&gt;

&lt;p&gt;The best thing to do in order to exclude the &lt;code&gt;.env&lt;/code&gt; file from online automatic deployments is to be super-proactive and maybe create your own automation to generate the &lt;code&gt;.gitignore&lt;/code&gt; file with relevant entries before adding anything to source control.&lt;/p&gt;

&lt;p&gt;This is for solutions that will based entirely on &lt;code&gt;.env&lt;/code&gt; file and store sensitive data and in cases that &lt;code&gt;.env&lt;/code&gt; files aren't excluded by the default &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;An example of .gitignore for .env files..&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.env*
.env.*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Or a more generic example below&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**/*.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Or an exclusion example for git..&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/*
!.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A generic .gitignore generator can also be found online -&amp;gt; &lt;a href="https://theapache64.github.io/git-do-not-ignore/" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ALSO:&lt;/strong&gt;&lt;br&gt;
In the unlikely case that you run an internal custom source control environment and for whatever reason want to add an .env file, you can do so as long as the server is only locally hosted.&lt;br&gt;
Even so, I would recommend to only add an &lt;code&gt;.env.example&lt;/code&gt; instead which is a shallow copy of the values of your completed &lt;code&gt;.env&lt;/code&gt; file that is required by your application.&lt;/p&gt;
&lt;h3&gt;
  
  
  3 .env - Direct usage in source:
&lt;/h3&gt;

&lt;p&gt;When referencing or using some environment file stored API key or any other setting, try to use a built-in secure library either provided by your own solution's framework or by an external package manager. &lt;/p&gt;

&lt;p&gt;Such an example is loading all environment config in Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;//load all environment variables from main configuration.&lt;/span&gt;
&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ENV_NAME&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or in laravel by using helper function config() with config.php file that stores environment variables (below):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cfg_name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;# 'cfg_name' stores the variable by env('ENV_NAME'); in the config.php file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4 .env - Comments:
&lt;/h3&gt;

&lt;p&gt;As environment variable files grow larger, the best thing you can do is add multiple urls or api key lists in a structured-format for easily finding and handling multiple values.&lt;/p&gt;

&lt;p&gt;This can be easily achieved by using start-end blocks of comments and also inline find by adding specific characters to the start and end of each comment for each setting.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example Comments here:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;-START API section- -END API section-&lt;/strong&gt; (for storing multiple api values).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&amp;lt;&amp;lt; IMPORTANT &amp;gt;&amp;gt;&lt;/strong&gt; (for sorting out what should be considered important or not).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[[ TEMPORARY ]] [[ WILL BE REMOVED ]]&lt;/strong&gt; (for indicating the importance level on parts that will be moved in a different setup of the application).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ALSO:&lt;/strong&gt;&lt;br&gt;
Avoid using a lot of comments in production files since these will not be changed or tampered with frequently and only add those during testing and debugging cycles on development.&lt;/p&gt;

&lt;h3&gt;
  
  
  5 .env - Encryption:
&lt;/h3&gt;

&lt;p&gt;In case that you still feel that you cannot get enough security by methods mentioned, you can have the option of completely encrypting the contents of the important .env file of your solution.&lt;br&gt;
In such a case, this needs to be done by the application level and not by the OS level for it to be effective.&lt;/p&gt;

&lt;p&gt;A small listing and corresponding sample usages of .env encryption capabilities is found below:&lt;/p&gt;

&lt;p&gt;1.Node.js/React.js Applications | &lt;a href="https://www.npmjs.com/package/secure-env" rel="noopener noreferrer"&gt;npm's secure-env&lt;/a&gt; | Default is a decent AES-256 plain-text encryption standard for the file.&lt;/p&gt;

&lt;p&gt;Sample Usage below:&lt;/p&gt;

&lt;p&gt;Encryption (cmd-line):&lt;br&gt;
&lt;code&gt;$ npx secure-env .env -s mySecretPassword&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Decryption (in-code):&lt;br&gt;
&lt;code&gt;require('secure-env')({path:'/custom/path/to/your/env/vars'});&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2.Node.js/React.js Applications | &lt;a href="https://www.npmjs.com/package/@tka85/dotenvenc" rel="noopener noreferrer"&gt;npm's dotenvenc&lt;/a&gt; | Typescript-based encryption utility for js, produces .env.enc files.&lt;/p&gt;

&lt;p&gt;Sample Usage below:&lt;/p&gt;

&lt;p&gt;Encryption (cmd-line, .env must be in project root):&lt;br&gt;
&lt;code&gt;./node_modules/.bin/dotenvenc -e&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Decryption (in-code):&lt;br&gt;
&lt;code&gt;require('dotenvenc').decrypt();&lt;br&gt;
// From here on your app will have access to the secrets through process.env.DB_SECRET1 and process.env.SECRET_VAR1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3.Node.js/React.js Applications | &lt;a href="https://fieldsmarshall.com/simple-encryption-for-env-file-in-nodejs" rel="noopener noreferrer"&gt;using node:crypto modules&lt;/a&gt; | Manually written code + tutorial for encrypting .env file.&lt;br&gt;
Sample usage on the website.&lt;/p&gt;

&lt;p&gt;4.PHP/Laravel Applications | &lt;a href="https://laravel.com/docs/master/configuration#environment-configuration" rel="noopener noreferrer"&gt;Laravel's official Docs&lt;/a&gt; | Built-in encryption standards for laravel web application solution to encrypt .env file using artisan commands.&lt;/p&gt;

&lt;p&gt;Sample Usage below:&lt;/p&gt;

&lt;p&gt;Encryption (cmd-line, multi environment targets):&lt;br&gt;
&lt;code&gt;php artisan env:encrypt&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan env:encrypt --env=staging&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Decryption (cmd-line, using laravel encr. key):&lt;br&gt;
&lt;code&gt;php artisan env:decrypt&lt;/code&gt;&lt;br&gt;
&lt;code&gt;php artisan env:decrypt --key=EncryptionKeyHere...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Decrypting/Using all the values per file in this case implies the usage on the entire application file per deployment on the server or writing custom artisan command in-code to automate the encryption process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE THAT:&lt;/strong&gt;&lt;br&gt;
As always, there is a fair trade-off between security and usability when encrypting code files like above since these might be affected or blocked by filesystem permission sets and the comments might be affected if your encryption library does not properly handle comments in the .env file.&lt;/p&gt;

&lt;p&gt;More encryption info &lt;a href="https://kovacsbrigi.medium.com/how-to-create-safety-env-file-in-laravel-project-a2807e5d1c1f#:~:text=Permission,from%20outside%20the%20public%20folder." rel="noopener noreferrer"&gt;HERE-MEDIUM&lt;/a&gt; and &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Laravel_Cheat_Sheet.html#cookie-security-and-session-management" rel="noopener noreferrer"&gt;HERE-OWASP&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6 .env - Virtual environments, debugging:
&lt;/h3&gt;

&lt;p&gt;Last but not least, in case that there is no time to do all of the above, a container runner can still be used to deploy the entire application to run in its own protected area with minimal effect on your server's security configuration.&lt;br&gt;
But simply not-using these set of standards still holds an additional security risk.&lt;br&gt;
Containerization services that can always be used to easily build-up and tear-down virtual environments for staging and debugging without having to fully secure the .env in your solution are as below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker with docker-compose.yaml (some partial exposure to .env might be required).&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Red Hat OpenShift&lt;/li&gt;
&lt;li&gt;Microsoft Azure Kubernetes Services (AKS)&lt;/li&gt;
&lt;li&gt;Google Kubernetes Engine (GKE)&lt;/li&gt;
&lt;li&gt;Amazon's Elastic Kubernetes Service (EKS)&lt;/li&gt;
&lt;li&gt;IBM's Istio services (IBM)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As far as I'm concerned if you are using any containerization tool, tightly locking the .env file should be optional and makes more sense to be flexible during debugging and code testing. Sometimes things need to be flexible to make it easy for the developers to build an application in order to make it less error-prone and more secure.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>dotenv</category>
      <category>devops</category>
      <category>javascript</category>
    </item>
    <item>
      <title>C# .NET Top 10 Compiler and .NET environment limits</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Fri, 08 Dec 2023 13:53:18 +0000</pubDate>
      <link>https://dev.to/chrdek/c-net-top-10-compiler-and-net-environment-limits-4lo</link>
      <guid>https://dev.to/chrdek/c-net-top-10-compiler-and-net-environment-limits-4lo</guid>
      <description>&lt;p&gt;After a few months of development work and some personal projects of mine (including 100s of deployments), I've set a part of my projects site, that is based on C# projects.&lt;/p&gt;

&lt;p&gt;The entire process and relevant setup led to this post which includes a list of basic C# usage limits also-known-as  &lt;strong&gt;the top 10 things to note when writing or testing code in your IDE with C#.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Limitation #1:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Int32.MaxValue&lt;/code&gt; 2^31 characters for string data types. This limitation is set mainly due to the CLR memory of .NETs runtime compilation environment. Similarly, the maximum number of elements that can be stored in the current implementation of &lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt; is, theoretically, &lt;code&gt;Int32.MaxValue&lt;/code&gt; (or) just over 2 billion (2^31). In current Microsoft CLR implementations there's a 2GB maximum object size limit. This applies exactly the same as HashTables, Arrays (2d or 1d) and other enumerations, indexed structures.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://www.codeproject.com/Articles/483475/Memory-Limits-in-a-NET-Process" rel="noopener noreferrer"&gt;.NET memory limits&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.red-gate.com/simple-talk/development/dotnet-development/object-overhead-the-hidden-net-memory-allocation-cost/" rel="noopener noreferrer"&gt;RedGate - memory allocation&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Limitation #2:&lt;/strong&gt;&lt;br&gt;
MAX_PATH per directory's path of 260 characters. This includes &lt;code&gt;"C:\"&lt;/code&gt; part prepended, which is followed by 256 string style &lt;code&gt;'\'&lt;/code&gt; characters and a null terminating character.&lt;/p&gt;

&lt;p&gt;The entire sequence of MAX_PATH in-stack is allocated as below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;some_256_character_path_string&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;NUL&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is both an OS and .NET imposed limitation since the .NET-based IDE sets it self up to the OS directory limits. Currently, this is applied from the CLR - for up to Windows 10 (1607) and newer versions.&lt;br&gt;
&lt;strong&gt;NOTE:&lt;/strong&gt; This is a Win32 relevant IDE limitation on Windows built-in API which can also be partially tweaked via the Windows registry (not recommended).&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry" rel="noopener noreferrer"&gt;MS - File path limits&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Limitation #3:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Multiple inheritance&lt;/em&gt; in C# by using classes and subclasses is not directly supported, similar behavior is applied by implementing one interface per class and then sub-classing for every other class that requires each set of interface properties.&lt;br&gt;
&lt;strong&gt;Not to be confused with multiple class styles (aka polymorphism),&lt;/strong&gt; C# cannot allow one class inheriting directly from multiple abstract or standard classes.&lt;br&gt;
This achieves simplicity and also mitigates the &lt;strong&gt;'diamond problem'&lt;/strong&gt; which involves ambiguous method calls that occur when a subclass inherits from two classes that share common method namings but have different behavior.&lt;/p&gt;

&lt;p&gt;Explicit interface implementation, allows secure design of the class hierarchy to avoid such conflicts.&lt;br&gt;
On the other hand standard class polymorphism is allowed by utilizing class overrides -as normal- by usage of &lt;code&gt;virtual&lt;/code&gt; &lt;code&gt;abstract&lt;/code&gt; keyword combinations between normal and abstract classes.&lt;br&gt;
Also: In C#, &lt;code&gt;struct&lt;/code&gt; does not support polymorphism directly but only via interface usage.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/object-oriented/inheritance" rel="noopener noreferrer"&gt;MS - Inheritance&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.geeksforgeeks.org/c-sharp-multiple-inheritance-using-interfaces/" rel="noopener noreferrer"&gt;Multi-Inheritance Example&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Limitation #4:&lt;/strong&gt;&lt;br&gt;
Tail recursion is not fully supported due to CLR limitations. (CLR allows no more than 100,000 nested function calls before stack resulting in runtime &lt;code&gt;StackOverflowException&lt;/code&gt; Error).&lt;br&gt;
Provided that &lt;code&gt;int.MaxValue&lt;/code&gt; is around 2.1 billion, most likely your program will never return or will give out a stack exception before reaching the global CLR maximum.&lt;/p&gt;

&lt;p&gt;Nonetheless, this can be mitigated by Bounce function support. This is implemented in-code by including Trampoline library. An alternative optimization would be to allow Head Recursive calls instead.&lt;/p&gt;

&lt;p&gt;An example of tail/head call is displayed below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="p"&gt;|&lt;/span&gt;     &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;                               &lt;span class="p"&gt;|&lt;/span&gt;     &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                  &lt;span class="p"&gt;|&lt;/span&gt;         &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                 &lt;span class="p"&gt;|&lt;/span&gt;             &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;                        &lt;span class="p"&gt;|&lt;/span&gt;         &lt;span class="k"&gt;else&lt;/span&gt;
  &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="p"&gt;|&lt;/span&gt;             &lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                                &lt;span class="p"&gt;|&lt;/span&gt;
    &lt;span class="nf"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                  &lt;span class="p"&gt;|&lt;/span&gt;     &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;                               &lt;span class="p"&gt;|&lt;/span&gt;     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another method of optimizing tail recursion so that the compiler does not run out of memory is temporary storing function calls during recurrent stack allocation (aka memoization). This reduces function calls so that methods apply to wider range of values with less error margin.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://thomaslevesque.com/2011/09/02/tail-recursion-in-c/" rel="noopener noreferrer"&gt;Tail Recursion, Trampoline lib example&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/23132424/self-recursive-function-limits" rel="noopener noreferrer"&gt;Stack Limits, other&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/21426688/the-difference-between-head-tail-recursion" rel="noopener noreferrer"&gt;Differences, code&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Limitation #5:&lt;/strong&gt;&lt;br&gt;
C# tuples support a maximum of 7 different data types of elements-by-value per data set for various data types (C# with .NET v4.0 and above).&lt;br&gt;
Constructor definition of ValueTuple displayed below:&lt;br&gt;
 &lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;ValueTuple&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T7&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;br&gt;
NOTE: For more than 7 different data types use TRest where TRest is a generic ValueType tuple instance declaring the rest of elements in sequence.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.valuetuple-8?view=net-8.0" rel="noopener noreferrer"&gt;MS - Tuples&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.pluralsight.com/guides/working-tuples-csharp" rel="noopener noreferrer"&gt;Tuple examples&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Limitation #6:&lt;/strong&gt;&lt;br&gt;
Some .NET CLR objects that do &lt;strong&gt;not directly implement&lt;/strong&gt; IDisposable:&lt;br&gt;
&lt;strong&gt;&lt;code&gt;StringBuilder&lt;/code&gt;, &lt;code&gt;Stream&lt;/code&gt;, &lt;code&gt;TcpClient&lt;/code&gt;, &lt;code&gt;MemoryStream&lt;/code&gt;, &lt;code&gt;RegistryKey&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;StringBuilder is used for efficient string manipulation. Since it doesn't implement IDisposable, it's important to dispose its resources, especially in scenarios where large strings are involved, to release memory.&lt;/p&gt;

&lt;p&gt;In order to reallocate memory in CLR un-managed data structures with manual garbage collection in the heap while running a program GC.Collect() is called manually for the mentioned cases of .NET data types. &lt;br&gt;
Such an example, &lt;em&gt;&lt;strong&gt;using Dispose pattern&lt;/strong&gt;&lt;/em&gt; is  displayed in the MS code block below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DisposableResourceHolder&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IDisposable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;SafeHandle&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// handle to a resource&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;DisposableResourceHolder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// allocates the resource&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Dispose&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;Dispose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;GC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SuppressFinalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Dispose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;disposing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disposing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Overall, objets with unsupported garbage collection capability of .NET are mainly but not limited to Win32 file handling wrappers that partially require OS resources.&lt;/p&gt;

&lt;p&gt;Alternatively, some .NET CLR objects that &lt;strong&gt;directly implement&lt;/strong&gt; IDisposable:&lt;br&gt;
&lt;strong&gt;&lt;code&gt;SqlConnection&lt;/code&gt;, &lt;code&gt;SqlCommand&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Overall most core data types in C# implement IDisposable. This design allows proper cleanup of resources such as closing file handles or network connections. The precise count varies with language updates and includes widely-used types and methods.&lt;/p&gt;

&lt;p&gt;Best approach when dealing with objects directly inheriting from &lt;code&gt;IDisposable&lt;/code&gt; is within &lt;code&gt;using(){ }&lt;/code&gt; blocks.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/dispose-pattern" rel="noopener noreferrer"&gt;MS - IDisposable, Dispose-Pattern&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/18336856/implementing-idisposable-correctly" rel="noopener noreferrer"&gt;IDisposable examples&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Limitation #7:&lt;/strong&gt;&lt;br&gt;
Minimum size for single large objects memory allocation, in large object heap allows for &lt;strong&gt;objects of up to 85,000 bytes and above.&lt;/strong&gt; These are usually arrays used in a program etc.&lt;/p&gt;

&lt;p&gt;Entire heap is separated in: large object heap (LOH) and the small object heap (SOH) where GC takes place during the lifespan of a program.&lt;/p&gt;

&lt;p&gt;Overall, each object's size smaller than 85Kbytes of maximum object heap gets written to SOH whereas sizes larger or equal to 85Kbytes in size are written to the LOH instead.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals" rel="noopener noreferrer"&gt;MS - Garbage collection fundamentals&lt;/a&gt;&lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/" rel="noopener noreferrer"&gt;MS - Garbage collection (LOH,SOH)&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Limitation #8:&lt;/strong&gt;&lt;br&gt;
This is a maximum limit that targets .NET 6.0 and above.&lt;br&gt;
&lt;code&gt;System.Text.Json&lt;/code&gt; Namespace Serialization Objects of UTF-8 encoding Json Writer's &lt;code&gt;Utf8JsonWriter&lt;/code&gt; method for tokenized plaintext input has a default &lt;strong&gt;maximum of 166 MB&lt;/strong&gt;. For its base-64 encoded counterpart &lt;strong&gt;125MB.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/migrate-from-newtonsoft?pivots=dotnet-6-0" rel="noopener noreferrer"&gt;MS - NewtonSoft.Json migration&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/dotnet/runtime/issues/30746" rel="noopener noreferrer"&gt;Relevant git issue&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Limitation #9:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;ThreadPool.SetMaxThreads&lt;/code&gt; and &lt;code&gt;ThreadPool.SetMinThreads&lt;/code&gt; are used to set maximum and minimum number of threads on demand as needed in a thread pool. By default, minimum number of threads in C# is analogous to the number of processors on a system. This applies to logical or physical processing units for multi-core CPUs. &lt;br&gt;
(4 thread min per 4-core CPU, 2 thread min per 2-core CPU etc.)&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://www.c-sharpcorner.com/article/thread-pool-in-net-core-and-c-sharp/" rel="noopener noreferrer"&gt;Thread Pool Example&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Limitation #10:&lt;/strong&gt;&lt;br&gt;
Number of numerical types adjacency groups for compile-time ValueType bindings. ValueType compiler boxing of values copied from method arguments or from one variable to another have the following type relevance as shown below:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Group 1.&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;SByte&lt;/code&gt; &amp;lt;-&amp;gt; &lt;code&gt;Int16&lt;/code&gt; &amp;lt;-&amp;gt; &lt;code&gt;Int32&lt;/code&gt; &amp;lt;-&amp;gt; &lt;code&gt;Int64&lt;/code&gt; &amp;lt;-&amp;gt; &lt;code&gt;Byte&lt;/code&gt; &amp;lt;-&amp;gt; &lt;code&gt;UInt16&lt;/code&gt; &amp;lt;-&amp;gt; &lt;code&gt;UInt32&lt;/code&gt; &amp;lt;-&amp;gt; &lt;code&gt;UInt64&lt;/code&gt; &amp;lt;-&amp;gt; &lt;code&gt;BigInteger&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Group 2.&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;float&lt;/code&gt; &amp;lt;-&amp;gt; &lt;code&gt;double&lt;/code&gt; &amp;lt;-&amp;gt; &lt;code&gt;Decimal&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
Also Max-Min limits for numerical ValueTypes mentioned are as below&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Max-Min values&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;sbyte&lt;/td&gt;
&lt;td&gt;-128 to 127&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;byte&lt;/td&gt;
&lt;td&gt;0 to 255&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;short&lt;/td&gt;
&lt;td&gt;-32,768 to 32,767&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ushort&lt;/td&gt;
&lt;td&gt;0 to 65,535&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;-2,147,483,648 to 2,147,483,647&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uint&lt;/td&gt;
&lt;td&gt;0 to 4,294,967,295&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;long&lt;/td&gt;
&lt;td&gt;-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ulong&lt;/td&gt;
&lt;td&gt;0 to 18,446,744,073,709,551,615&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nint&lt;/td&gt;
&lt;td&gt;Depends on platform (computed at runtime)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nuint&lt;/td&gt;
&lt;td&gt;Depends on platform (computed at runtime)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/integral-numeric-types" rel="noopener noreferrer"&gt;MS - Numeric max-min sizes&lt;/a&gt;&lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.valuetype?view=net-8.0&amp;amp;redirectedfrom=MSDN" rel="noopener noreferrer"&gt;MS - Numeric ValueTypes&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/828807/what-is-the-base-class-for-numeric-value-types" rel="noopener noreferrer"&gt;Numeric types discussion&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;Bonus #1:&lt;br&gt;
6 different ways of declaring and combining string values inside another string in .NET.&lt;br&gt;
&lt;strong&gt;1.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//string interpolation with $"" prefixing:&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"Hello, &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//string.Format Method and {0},{1},{2} templated string placeholders:&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, {0}!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Direct '+' operator string concatenation or by using '+=' operator: &lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//String.Concat Method&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;firstName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;lastName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Doe"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;fullName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//StringBuilder Append Method for appending bulk lines of text:&lt;/span&gt;
&lt;span class="n"&gt;StringBuilder&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;StringBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"World!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//string.Join Method:&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; String methods are not recommended for setting SQL statements in code, refrain from using it as such and use properties instead.&lt;br&gt;
In case you need to do it, the most secure ways of handling it are: &lt;code&gt;String.Format&lt;/code&gt;, String interpolation, StringBuilder's &lt;code&gt;Append()&lt;/code&gt; methods.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
Bonus #2:&lt;br&gt;
&lt;code&gt;T&lt;/code&gt; can be applied to a set of enumerable data sources, including but not limited-to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In-memory collections such as Generics.&lt;/li&gt;
&lt;li&gt;Arrays&lt;/li&gt;
&lt;li&gt;Other types implementing IEnumerable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;TSource&lt;/code&gt; can be applied to directly dynamically allocated data sources typically used within Visual Studio.&lt;/p&gt;

&lt;p&gt;TSource is tailored-made for data sources that implement IQueryable, which typically include database queries and other queryable providers (EntityFramework Entities etc.).&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
Bonus #3:&lt;br&gt;
Limitation of 4 object generations in heap space garbage collections.&lt;br&gt;
Heap Objects are garbage-collected in the order displayed below:&lt;br&gt;
Gen0 -&amp;gt; SOH Objects Garbage Collected Objects.&lt;br&gt;
Gen1 -&amp;gt; SOH Objects Garbage Collected Objects.&lt;br&gt;
Gen2,3 -&amp;gt; LOH Objects Garbage Collected Objects.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals" rel="noopener noreferrer"&gt;MS - Garbage collection fundamentals&lt;/a&gt;&lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/" rel="noopener noreferrer"&gt;MS - Garbage collection (LOH,SOH)&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/41521919/how-garbage-collection-decides-generation-for-variable" rel="noopener noreferrer"&gt;Other Gen0-Gen2 examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
Bonus #4:&lt;br&gt;
Recommended case limitations of when to use enumeration yields or &lt;code&gt;yield return&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Case 1:&lt;/strong&gt; Do not use within enumeration sequence loops with &lt;code&gt;foreach( var i in items)&lt;/code&gt;, since it causes arbitrary calls to &lt;code&gt;MoveNext()&lt;/code&gt; per element, causing uncessecary overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Case 2:&lt;/strong&gt; Only use per lazily evaluated values. Do not use for specific items that need to be sequentially accessed by number such as array &lt;em&gt;element[1]&lt;/em&gt; then &lt;em&gt;element[2]&lt;/em&gt; and will need to be processed one after another.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Case 3:&lt;/strong&gt; Use only when allocating a long sequence (lot of memory) at once and do not require specific elements separately, such as retrieve a list of all items etc..&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Case 4:&lt;/strong&gt; Do not use when you don't want to defer execution state when calling the iterator part. Eg: When throwning an exception then yield returning, causes delay until exception gets thrown properly. This applies to only large yield cases when a delay is noticed before the exception.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/3969963/when-not-to-use-yield-return" rel="noopener noreferrer"&gt;Discussion with examples&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;h4&gt;
  
  
  Bonuses section completes the list of the most important features of in-IDE C# usage for the majority of .NET programmers.
&lt;/h4&gt;

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

&lt;p&gt;&lt;strong&gt;UPDATE: Included also a PDF CheatSheet for direct download &lt;a href="https://res.cloudinary.com/dmjcetjt8/image/upload/v1702138892/c_-limits-max_min_s4g1wd.pdf" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note that: this is purely for improving development only and not taken in any other way. In case I have not added something important or not in-line with latest .NET versions drop me a line in the 'Top Comments' section. See you!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>programming</category>
      <category>visualstudio</category>
    </item>
    <item>
      <title>What would be a good starting project on blockchain, web3?</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Thu, 12 May 2022 13:28:37 +0000</pubDate>
      <link>https://dev.to/chrdek/what-would-be-a-good-starting-project-on-blockchain-web3-5c8j</link>
      <guid>https://dev.to/chrdek/what-would-be-a-good-starting-project-on-blockchain-web3-5c8j</guid>
      <description>&lt;p&gt;I was wondering what would be a good starting project that involves blockchain technology and Dapps?&lt;/p&gt;

&lt;p&gt;Any kind of feedback is highly appreciated.&lt;/p&gt;

&lt;p&gt;thanks.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>blockchain</category>
      <category>dapps</category>
    </item>
    <item>
      <title>5 methods for setting up a CDN for your site's content</title>
      <dc:creator>chrdek</dc:creator>
      <pubDate>Thu, 31 Dec 2020 15:55:21 +0000</pubDate>
      <link>https://dev.to/chrdek/5-methods-for-setting-up-a-cdn-for-your-site-s-content-fp8</link>
      <guid>https://dev.to/chrdek/5-methods-for-setting-up-a-cdn-for-your-site-s-content-fp8</guid>
      <description>&lt;h3&gt;
  
  
  &lt;center&gt;Setting up web content delivery (free options).&lt;/center&gt;
&lt;/h3&gt;




&lt;p&gt;As I've been trying to organize some scripts and other type of content on a website I was working on, I reached the point where it would be necessary to set up a custom CDN or use one for specific scripts delivery.&lt;br&gt;
Following is a list of 5 relatively simple &lt;strong&gt;-and free- methods&lt;/strong&gt; of setting up a CDN to run your site's scripts from.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Set your scripts on a cloud hosted provider&lt;/em&gt;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Most serverless hosted CDN on the cloud include common features and functionality such as video/audio streaming, HTTPS/HTTP/2,3 support using multiple IP locations and secure caching.&lt;/p&gt;

&lt;p&gt;A small listing of the most popular cloud hosted CDNs that include a trial on content hosting is found below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://bunnycdn.com/features" rel="noopener noreferrer"&gt;BunnyCDN&lt;/a&gt; - Main site allows for a 14 day trial which includes full CDN features support such as HTTPS HTTP/2, video streaming, caching and compression with DDoS security.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.limelight.com/products/content-delivery-network/" rel="noopener noreferrer"&gt;LimeLight CDN&lt;/a&gt; - Limelight's free trial option requires to contact the sales team for accessing certain features. Aside from that, supports full set of edge-based content delivery network with relevant HTTP protocols support with and streaming. Another great feature is the bundled Web Application Firewall that includes application-level protection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cloud.google.com/cdn" rel="noopener noreferrer"&gt;CloudCDN via GCP (Google)&lt;/a&gt; - Accessible with a free google account, supports HTTPS/HTTP/2,3 logging exports via BigQuery and Google Cloud Storage platforms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.cloudflare.com/plans/" rel="noopener noreferrer"&gt;CloudFlare CDN&lt;/a&gt; - Free plan that supports integrated DDoS security, HTTPS/HTTP/2,3 with video streaming and CDN customization with automation. Add-ons might require monthly payment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;
  
  
  &lt;strong&gt;&lt;em&gt;CDN sourced in-app script render on personal cloud AWS instance with npm express-cdn&lt;/em&gt;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;In case you are looking to integrate your personal CDN scripts in your application, you can also setup a NodeJS server to load your scripts from geographically redundant locations.&lt;/p&gt;

&lt;p&gt;The express-cdn package allows for dynamic script tags rendering by utilizing an AWS S3 bucket account so hosting is done from the S3 locators allowing your site's server to off-load script request traffic based on geographic proximity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplified list of steps to set it up is shown below:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a top-level CNAME domain of &lt;code&gt;your-domain.com&lt;/code&gt; for your website on aws.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an S3 bucket for your aws storage account and upload a default index.html file as a placeholder and publicize the bucket URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new distribution network on aws CloudFront with the following options:&lt;br&gt;
Origin domain name=&lt;code&gt;bucket-name.s3.amazonaws.com&lt;/code&gt;&lt;br&gt;
Origin ID=&lt;code&gt;bucket-name&lt;/code&gt;&lt;br&gt;
Network Path=Accept all network paths using the asterisk &lt;code&gt;*&lt;/code&gt; option&lt;br&gt;
Alternate domain names=&lt;code&gt;cdn.your-domain.com&lt;/code&gt; where &lt;code&gt;your-domain.com&lt;/code&gt; is the top-level CNAME domain created in step 1.&lt;br&gt;
Save the created cloudfront domain name produced in the format &lt;code&gt;xxx.cloudfront.net&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From your aws DNS manager create a new CNAME record with hostname value of &lt;code&gt;cdn&lt;/code&gt; and set its alias/pointer record value to the &lt;code&gt;xxx.cloudfront.net&lt;/code&gt; from step 3 and wait for the cloud records to update. Once everything is done properly you should have a link with &lt;code&gt;http://cdn.your-domain.com&lt;/code&gt; that loads the index.html from the corresponding S3 bucket.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As far as the web server setup is concerned, you need to have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nodejs with express running and rendering engine (jade/ejs preferred).&lt;/li&gt;
&lt;li&gt;express-cdn installed and appropriate module requires.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var express = require('express')
  , path    = require('path')
  , app     = express.createServer()
  , semver  = require('semver');
var sslEnabled = false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Relevant initialization settings of the express-cdn module 
&lt;code&gt;var CDN = require('express-cdn')(app, options);&lt;/code&gt;. &lt;code&gt;options&lt;/code&gt; include your cdn name, s3 bucket settings, access keys and local server settings. The &lt;code&gt;CDN()&lt;/code&gt; helper object itself will generate the necessary &lt;code&gt;src=&lt;/code&gt; or &lt;code&gt;data-src=&lt;/code&gt; script tags on-demand from the S3-hosted content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: In order to have aws ssl setting applied, you need to use a sub-domain since canonical names are not supported.&lt;br&gt;
These are the main settings of aws usage on express-cdn. Full set of detailed instructions can be found in the official link &lt;a href="https://www.npmjs.com/package/express-cdn#cdn-setup-instructions" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;


&lt;h4&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Customizable private CDN setup on Varnish [and VCL files]&lt;/em&gt;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Even though this is a more time-consuming solution, it allows for more flexibility on your server setup and provides more control on your CDN infrastructure parts.&lt;br&gt;
Considering a personal &lt;em&gt;Ubuntu&lt;/em&gt; or &lt;em&gt;Debian&lt;/em&gt; environment setup, you can install varnish server runner locally using apt-get or yum packagers per CDN instance.&lt;br&gt;
Start from your shell by running &lt;code&gt;apt-get install varnish-plus&lt;/code&gt; to install the necessary files.&lt;br&gt;
Run &lt;code&gt;netstat -lp | grep varnishd&lt;/code&gt; to check whether your service is up an running or check for daemon activity via &lt;code&gt;systemctl status varnishd&lt;/code&gt;. In case you need to build the package manually you can try the following method:&lt;br&gt;
Download the source manually using &lt;code&gt;apt-get source varnish&lt;/code&gt;.&lt;br&gt;
Set the VARNISHSRC environment variable value to the directory that the package was downloaded using &lt;code&gt;./configure VARNISHSRC=$HOME/varnish-3.*&lt;/code&gt;.&lt;br&gt;
Run the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make 
sudo make install
sudo make check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to build and install. This procedure also applies to downloaded additional modules.&lt;/p&gt;

&lt;p&gt;Once you get the service running, an additional setup of the &lt;em&gt;*.vcl&lt;/em&gt; configuration files is required to set it for content caching.&lt;/p&gt;

&lt;p&gt;Modify the &lt;code&gt;/etc/varnish/default.vcl&lt;/code&gt; file so that backend default section points to your localhost and forwarded port&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;backend default {
   .host = "localhost";
   .port = "8080";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modify the &lt;code&gt;/etc/default/varnish.param&lt;/code&gt; file so that inbound HTTP (port 80) requests are handled accordingly by &lt;code&gt;varnishd -a: 80&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Restart varnish daemon by running &lt;code&gt;systemctl service varnish start&lt;/code&gt;.&lt;br&gt;
An alternative way of starting the server is to specify manually the VCL config by running &lt;code&gt;varnishd -a :80 -T localhost:8080 -f /etc/varnish/default.vcl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A generalized topology would be to have 3 geographically separated servers each running behind a NAT or firewall and each one to handle the same content for a site, based on the location of the requests.&lt;/p&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;&lt;em&gt;AWS CloudFront with an AWS Domain&lt;/em&gt;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The initial method of setting up an S3 bucket en-par with a CNAME domain name on amazon's CloudFront is described already in the npm express-cdn section of this post.&lt;br&gt;
Note that AWS CloudFront for content distribution is free but since it utilizes a bucket account, related charges still apply per frequency and usage of your storage. So you might need to set a couple of limits (quotas, whitelisting or ACLs) for retaining your free or low cost.&lt;/p&gt;

&lt;p&gt;Apart from the express-based dynamic cdn rendering outlined above, you can set it just for caching content on your website or even have multiple bucket locations serving content for more than one copies of your website.&lt;/p&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Azure CDN using custom domain provider&lt;/em&gt;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;As with AWS CloudFront, serving content from Azure CDN is similarly done via:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setting an Azure AD top level domain. &lt;/li&gt;
&lt;li&gt;Registering, adding CDN in Azure Active Directory.&lt;/li&gt;
&lt;li&gt;Setting up Azure Key Vault for AD.&lt;/li&gt;
&lt;li&gt;Granting Azure access to the Key Vault for the CDN setup.&lt;/li&gt;
&lt;li&gt;Enabling https in Azure CDN for azure's custom domain.&lt;/li&gt;
&lt;li&gt;Making sure that all Azure Firewall Web Application Policies are in place and working for the CDN setup.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Alternatively, you can automatically setup a deployment from azure resource manager job by using an azure arm quickstart template. The latest templates can be found from &lt;a href="https://docs.microsoft.com/en-us/azure/templates/microsoft.cdn/2020-04-15/profiles" rel="noopener noreferrer"&gt;MS here.&lt;/a&gt;&lt;/p&gt;



&lt;h5&gt;
  
  
  &lt;em&gt;&lt;strong&gt;Non-cdn method for loading scripts&lt;/strong&gt;&lt;/em&gt;
&lt;/h5&gt;

&lt;p&gt;In case that you can't use any of the methods above or if you have an environment that is too restrictive, you can load your scripts from a file server on-premises so that you don't overload your website with heavy traffic. The scripts and images might be statically loaded but this is better than loading everything on one server. In a simple node-express setup this is also done by&lt;br&gt;
&lt;code&gt;express.use("/src/js", express.static(__dirname + "/media/js"));&lt;/code&gt; to serve static content for a site.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
That is all I could find on privatizing your cache for your web content.&lt;/p&gt;

&lt;p&gt;Hopefully this proves useful for sending your wishes across the globe. &lt;em&gt;&lt;strong&gt;Happy new year 2021!!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dzone.com/articles/build-your-own-cdn-in-5-steps" rel="noopener noreferrer"&gt;Varnish DIY CDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cdn</category>
      <category>webdev</category>
      <category>aws</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
