<?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: Kosa Matyas</title>
    <description>The latest articles on DEV Community by Kosa Matyas (@kosa12).</description>
    <link>https://dev.to/kosa12</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%2F1249815%2F3c0846b2-5a0f-4026-a574-0dc6cd11d7c9.jpeg</url>
      <title>DEV Community: Kosa Matyas</title>
      <link>https://dev.to/kosa12</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kosa12"/>
    <language>en</language>
    <item>
      <title>hyprKCS - Hyprland keybind manager</title>
      <dc:creator>Kosa Matyas</dc:creator>
      <pubDate>Wed, 14 Jan 2026 14:42:09 +0000</pubDate>
      <link>https://dev.to/kosa12/hyprkcs-hyprland-keybind-manager-7ok</link>
      <guid>https://dev.to/kosa12/hyprkcs-hyprland-keybind-manager-7ok</guid>
      <description>&lt;p&gt;&lt;strong&gt;Ever forget your own keybinds? Tired of grepping through 5 different config files just to change a workspace shortcut?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meet &lt;a href="https://github.com/kosa12/hyprKCS" rel="noopener noreferrer"&gt;&lt;strong&gt;hyprKCS&lt;/strong&gt;&lt;/a&gt; - a native, fast GUI written in &lt;strong&gt;Rust&lt;/strong&gt; &amp;amp; &lt;strong&gt;GTK4&lt;/strong&gt;. It parses your config (and recursively sourced files!) to give you a searchable, interactive dashboard for your system.&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%2Fd69ag74tnpoii8m3r20e.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%2Fd69ag74tnpoii8m3r20e.png" alt=" " width="667" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Fuzzy Search:&lt;/strong&gt; Find actions instantly (e.g., type "resize" or "volume").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add, Edit &amp;amp; Delete:&lt;/strong&gt; Full CRUD support for your keybinds directly from the UI.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Key Recorder:&lt;/strong&gt; Don't type out &lt;code&gt;SUPER + SHIFT + Q&lt;/code&gt;. Just click "Record" and press the keys.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Deep Parsing:&lt;/strong&gt; Reads &lt;code&gt;source = ...&lt;/code&gt; directives recursively across your entire setup.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Native UI:&lt;/strong&gt; Built with Libadwaita to match your system theme (Dark/Light mode) seamlessly.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Direct Control:&lt;/strong&gt; Execute and test binds directly from the UI via &lt;code&gt;hyprctl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Conflict Wizard:&lt;/strong&gt; Automatically detects duplicate binds and walks you through resolving them interactively. No more hunting for that one duplicate &lt;code&gt;SUPER + Q&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Massive Optimization:&lt;/strong&gt; Refactored the parser logic and switched to the &lt;code&gt;jemalloc&lt;/code&gt; allocator. It's now lighter and faster than ever.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Smart Backups:&lt;/strong&gt; One-click backup that recursively saves your main config &lt;em&gt;and&lt;/em&gt; all sourced files into a timestamped directory.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Arch Linux (AUR):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yay &lt;span class="nt"&gt;-S&lt;/span&gt; hyprkcs-git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nix run github:kosa12/hyprKCS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Technical Highlights:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Recursive Parser:&lt;/strong&gt; Custom Regex-based parser that handles variable resolution (&lt;code&gt;$mainMod&lt;/code&gt;) and recursive file sourcing.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Memory Optimization:&lt;/strong&gt; Recently switched to &lt;code&gt;tikv-jemallocator&lt;/code&gt; on Linux and optimized the parsing algorithm (removed O(n²) sorting), resulting in a negligible memory footprint (~20-30MB RSS in release mode).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Layer Shell:&lt;/strong&gt; Uses &lt;code&gt;gtk4-layer-shell&lt;/code&gt; to render as a proper overlay application that respects Hyprland's window rules.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/kosa12/hyprKCS" rel="noopener noreferrer"&gt;https://github.com/kosa12/hyprKCS&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>rust</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Image Dithering made fast and free</title>
      <dc:creator>Kosa Matyas</dc:creator>
      <pubDate>Sun, 16 Nov 2025 09:47:14 +0000</pubDate>
      <link>https://dev.to/kosa12/image-dithering-made-fast-and-free-9lo</link>
      <guid>https://dev.to/kosa12/image-dithering-made-fast-and-free-9lo</guid>
      <description>&lt;h2&gt;
  
  
  Turbo Dither: High-Performance Browser-Based Image Dithering with Retro Flair
&lt;/h2&gt;

&lt;p&gt;-&amp;gt; &lt;em&gt;&lt;a href="https://www.turbodither.com/" rel="noopener noreferrer"&gt;turbodither.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the world of digital imaging, dithering remains a timeless technique for simulating colors and gradients in limited palettes.&lt;br&gt;
&lt;strong&gt;Turbo Dither&lt;/strong&gt; is a cutting-edge tool that brings professional-grade dithering to your browser. Built with Next.js 15 and React 19, this free application transforms ordinary images into retro masterpieces using authentic algorithms and color schemes from computing history; all without servers, accounts, or compromises on privacy.&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%2Fr9c67fqyjg5ci1p3youo.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%2Fr9c67fqyjg5ci1p3youo.png" alt="Demo screenshot" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Features That Set It Apart
&lt;/h2&gt;

&lt;p&gt;Turbo Dither prioritizes speed, usability, and authenticity. Key highlights include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blazing-Fast&lt;/strong&gt; (even though it's not in Rust) &lt;strong&gt;Processing&lt;/strong&gt;: Leveraging Web Workers, image transformations occur in a background thread, ensuring a buttery-smooth UI even on mobile devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diverse Dithering Algorithms&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Floyd-Steinberg&lt;/em&gt;: Error diffusion for natural details.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Atkinson&lt;/em&gt;: Macintosh-inspired brightness and contrast.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Ordered (Bayer)&lt;/em&gt;: Pattern-based for classic crosshatch effects.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Jarvis-Judice-Ninke&lt;/em&gt;: Wide-area diffusion for ultra-smooth gradients.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;14 Retro Palettes&lt;/strong&gt;: From CGA's 4 colors to NES's 64, including Game Boy, Commodore 64, Pico-8, and grayscale variants.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Fine-Tuned Controls&lt;/strong&gt;: Adjust brightness, contrast, saturation, diffusion factor (0.0–2.0), and dither scale for pixel-perfect results.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Privacy and Freedom&lt;/strong&gt;: 100% client-side—no uploads, account creation, or watermarks.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Interactive Tools&lt;/strong&gt;: Real-time side-by-side comparisons, progress indicators, and PNG exports with custom names.&lt;/li&gt;

&lt;/ul&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%2Fteux6cdift3auwf2lcrb.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%2Fteux6cdift3auwf2lcrb.png" alt="Control panel" width="279" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Stack and Architecture
&lt;/h2&gt;

&lt;p&gt;Powered by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 15.&lt;/li&gt;
&lt;li&gt;React 19 (with useReducer for state, useTransition for concurrency).&lt;/li&gt;
&lt;li&gt;TypeScript 5.&lt;/li&gt;
&lt;li&gt;Bun 1.3.1.&lt;/li&gt;
&lt;li&gt;Web Workers &amp;amp; Canvas API (core processing).&lt;/li&gt;
&lt;li&gt;CSS Modules.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance and Optimizations
&lt;/h2&gt;

&lt;p&gt;Optimizations include typed arrays, progress streaming, and React 19 concurrency. All in-browser; no latency from servers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small images (&amp;lt;500KB): 4–20ms.&lt;/li&gt;
&lt;li&gt;Medium (500KB–2MB): 20–100ms.&lt;/li&gt;
&lt;li&gt;Large (&amp;gt;2MB): 100–500ms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance demo:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;1920x1080, 10.3MB&lt;/code&gt; image compressed to &lt;code&gt;1920x1080, 498KB&lt;/code&gt; in &lt;strong&gt;211ms&lt;/strong&gt;.&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%2F2rs7bwpin3rm8bbssc2x.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%2F2rs7bwpin3rm8bbssc2x.png" alt="Perforance demo" width="800" height="339"&gt;&lt;/a&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%2Fci9g6v5ah9wcst47wu27.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%2Fci9g6v5ah9wcst47wu27.png" alt="Dithered images" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap Ahead
&lt;/h2&gt;

&lt;p&gt;Future enhancements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More algorithms (Sierra, Burkes).&lt;/li&gt;
&lt;li&gt;Additional palettes (Amstrad, MSX2).&lt;/li&gt;
&lt;li&gt;Batch processing, custom palettes, multi-format exports.&lt;/li&gt;
&lt;li&gt;PWA offline support, drag-and-drop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Check the live demo at &lt;a href="https://www.turbodither.com/" rel="noopener noreferrer"&gt;turbodither.com&lt;/a&gt; and leave comment or DM me on X/Twitter (&lt;a href="https://x.com/kosa12" rel="noopener noreferrer"&gt;@kosa12&lt;/a&gt;) for your thought and reviews about Turbo Dither❤️&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>performance</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Docker on Linux: A Quick Guide for Debian and Arch-Based Systems</title>
      <dc:creator>Kosa Matyas</dc:creator>
      <pubDate>Sat, 23 Nov 2024 09:17:15 +0000</pubDate>
      <link>https://dev.to/kosa12/docker-on-linux-a-quick-guide-for-debian-and-arch-based-systems-46fa</link>
      <guid>https://dev.to/kosa12/docker-on-linux-a-quick-guide-for-debian-and-arch-based-systems-46fa</guid>
      <description>&lt;p&gt;Docker is an essential tool for modern software development. It simplifies deploying applications by isolating them in lightweight, portable containers. This guide will walk you through installing Docker on Debian and Arch-based systems, verifying the installation, and running your first container.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installing Docker on Debian-Based Systems
&lt;/h2&gt;

&lt;p&gt;1.&lt;strong&gt;Update the Package Index&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Open a terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.&lt;strong&gt;Install Required Dependencies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install packages required to add Docker's official GPG key and repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;       &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; apt-transport-https ca-certificates curl software-properties-common
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.&lt;strong&gt;Add Docker's GPG Key and Repository&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; docker-ce docker-ce-cli containerd.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installing Docker on Arch-Based Systems
&lt;/h2&gt;

&lt;p&gt;1.&lt;strong&gt;Update the System&lt;/strong&gt;&lt;br&gt;
Run the following command to ensure your system is up-to-date:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-Syu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.&lt;strong&gt;Start and Enable Docker&lt;/strong&gt;&lt;br&gt;
Start the Docker service and enable it to run at boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Testing Docker Installation
&lt;/h2&gt;

&lt;p&gt;To ensure Docker is properly installed and running:&lt;/p&gt;

&lt;p&gt;1.&lt;strong&gt;Check the Docker Service&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a status like &lt;code&gt;Active: active (running)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;2.&lt;strong&gt;Run the Hello World Container&lt;/strong&gt;&lt;br&gt;
Test your Docker setup by running a test container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker run hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Docker is correctly installed, you'll see a message like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Hello from Docker! This message shows that your installation appears to be working correctly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;&lt;strong&gt;Congratulations!&lt;/strong&gt; You’ve installed Docker, tested its setup, and run your first container. Whether you’re on Debian or Arch-based Linux, Docker simplifies application deployment and development. Dive deeper into Docker’s capabilities, and start containerizing your applications today!&lt;/p&gt;

</description>
      <category>linux</category>
      <category>docker</category>
      <category>devops</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Creating and Securing JWT Authentication in a Web App</title>
      <dc:creator>Kosa Matyas</dc:creator>
      <pubDate>Fri, 08 Nov 2024 18:43:02 +0000</pubDate>
      <link>https://dev.to/kosa12/creating-and-securing-jwt-authentication-in-a-web-app-5cni</link>
      <guid>https://dev.to/kosa12/creating-and-securing-jwt-authentication-in-a-web-app-5cni</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;JSON Web Tokens (JWT) are a compact and self-contained way of securely transmitting information between parties as a JSON object. JWTs are widely used for authenticating users in web applications. In this tutorial, we’ll build a Node.js and Express backend with JWT authentication.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is JWT?
&lt;/h2&gt;

&lt;p&gt;JWT (JSON Web Token) is an open standard for securely transmitting information between parties as a JSON object. Each token consists of three parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Header: Contains information about the token's type and hashing algorithm.&lt;/li&gt;
&lt;li&gt;Payload: Contains user information and claims.&lt;/li&gt;
&lt;li&gt;Signature: Verifies the integrity of the token.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Example JWT
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0IiwidXNlcm5hbWUiOiJqb2huZG9lIn0.H6BBiB1y5eXKXvW9bbjT2Rg8Jp4oE4Y5Kxf_sDF7Kzg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Setting Up the Project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new project directory:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;jwt-auth-app
&lt;span class="nb"&gt;cd &lt;/span&gt;jwt-auth-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initialize a new Node.js project:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Installing Dependencies
&lt;/h2&gt;

&lt;p&gt;Install the necessary dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express jsonwebtoken bcryptjs dotenv express-validator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;express: Web framework for Node.js.&lt;/li&gt;
&lt;li&gt;jsonwebtoken: Library for generating and verifying JWTs.&lt;/li&gt;
&lt;li&gt;bcryptjs: Library for hashing passwords.&lt;/li&gt;
&lt;li&gt;dotenv: For environment variables.&lt;/li&gt;
&lt;li&gt;express-validator: For validating input data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuring the Server
&lt;/h2&gt;

&lt;p&gt;Create a basic server setup in &lt;code&gt;server.js&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="c1"&gt;// server.js&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="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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&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="s1"&gt;express&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// Import Routes&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authRoutes&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="s1"&gt;./routes/auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;authRoutes&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;PORT&lt;/span&gt; &lt;span class="o"&gt;=&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;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server running on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file for storing environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PORT=5000
JWT_SECRET=your_jwt_secret_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creating User Authentication Routes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create the &lt;code&gt;routes/auth.js&lt;/code&gt; file for authentication routes:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// routes/auth.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&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="s1"&gt;express&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;validationResult&lt;/span&gt; &lt;span class="p"&gt;}&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="s1"&gt;express-validator&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;bcrypt&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="s1"&gt;bcryptjs&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;jwt&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="s1"&gt;jsonwebtoken&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;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Router&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;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt; &lt;span class="c1"&gt;// In-memory user storage&lt;/span&gt;

&lt;span class="c1"&gt;// Signup Route&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/signup&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;body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;isLength&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;isLength&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;errors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;validationResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&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;hashedPassword&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;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;hashedPassword&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User registered successfully&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;span class="c1"&gt;// Login Route&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/login&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;body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;notEmpty&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;notEmpty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;errors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;validationResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;username&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid credentials&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;isMatch&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;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isMatch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid credentials&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;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="p"&gt;},&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;JWT_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;expiresIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1h&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;token&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Explanation of Routes&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Signup Route: Validates and hashes the password before storing the user.&lt;/li&gt;
&lt;li&gt;Login Route: Validates credentials, checks password, and issues a JWT token.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Generating JWT Tokens
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;jwt.sign&lt;/code&gt; method generates a token containing the user’s information.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;JWT_SECRET&lt;/code&gt; is used to sign the token, which should be kept secure and private.
&lt;/li&gt;
&lt;/ul&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;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="p"&gt;},&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;JWT_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;expiresIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1h&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Securing Routes with JWT
&lt;/h2&gt;

&lt;p&gt;To protect routes, create a middleware to verify tokens.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create &lt;code&gt;middleware/auth.js&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// middleware/auth.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jwt&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="s1"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&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;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Access denied&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&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;JWT_SECRET&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;decoded&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;next&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;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid token&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;ol&gt;
&lt;li&gt;Protect Routes in &lt;code&gt;server.js&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create a protected route that requires a valid token:&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="c1"&gt;// In server.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authMiddleware&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="s1"&gt;./middleware/auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/protected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;authMiddleware&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is a protected route&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&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;h2&gt;
  
  
  Explanation of Middleware
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The middleware checks for the presence of the token in the &lt;code&gt;Authorization&lt;/code&gt; header.&lt;/li&gt;
&lt;li&gt;If the token is valid, the user’s information is added to the &lt;code&gt;req&lt;/code&gt; object, allowing access to the protected route.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;In this tutorial, we’ve covered the basics of setting up JWT authentication in a Node.js and Express backend. This guide demonstrated:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setting up authentication routes for signup and login.&lt;/li&gt;
&lt;li&gt;Creating and verifying JWT tokens.&lt;/li&gt;
&lt;li&gt;Securing routes with a JWT-based middleware.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;JWTs are a powerful way to handle authentication, making your web applications both secure and scalable.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>📈 Making Your GitHub Repository Stand Out With 12 Easy Steps!</title>
      <dc:creator>Kosa Matyas</dc:creator>
      <pubDate>Wed, 06 Nov 2024 12:49:27 +0000</pubDate>
      <link>https://dev.to/kosa12/making-your-github-repository-stand-out-5gef</link>
      <guid>https://dev.to/kosa12/making-your-github-repository-stand-out-5gef</guid>
      <description>&lt;p&gt;Creating an eye-catching &lt;strong&gt;GitHub&lt;/strong&gt; repository is key to attracting users, potential contributors, and recruiters. This guide will help you optimize your repository to make it appealing and increase its visibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Craft an Attractive README.md 🚀
&lt;/h2&gt;

&lt;p&gt;The README is often the first thing users see, so make it engaging and informative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Elements to Include&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project Name and Description: Clearly state the purpose and key features.&lt;/li&gt;
&lt;li&gt;Visuals: Add screenshots, GIFs, or videos to showcase your project.&lt;/li&gt;
&lt;li&gt;Installation Instructions: Provide step-by-step instructions.&lt;/li&gt;
&lt;li&gt;Usage Examples: Help users understand how to use your project.&lt;/li&gt;
&lt;li&gt;Features: List the features and functionality.&lt;/li&gt;
&lt;li&gt;Contributing Guidelines: Encourage contributions by including clear guidelines.&lt;/li&gt;
&lt;li&gt;License Information: Make the license clear.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use websites that help with the markdown&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://readme.so/" rel="noopener noreferrer"&gt;readme.so&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.makeareadme.com/" rel="noopener noreferrer"&gt;makeareadme.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Use an Eye-Catching Repository Banner 📸
&lt;/h2&gt;

&lt;p&gt;You can add a &lt;strong&gt;banner image&lt;/strong&gt; at the top of your repository. Create a custom banner that highlights your project's name and key features. You can add it directly to your README or as a repository social media preview.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps to Add:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a 1200 x 600px image with your project name, logo, and tagline.&lt;/li&gt;
&lt;li&gt;Go to the "Settings" of your repository.&lt;/li&gt;
&lt;li&gt;Under "Social preview," upload the banner image.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  3. Organize with Folders and Labels 📂
&lt;/h2&gt;

&lt;p&gt;Use well-organized folders and file names to make your project easy to navigate. Use labels effectively for issues, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;good first issue&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;help wanted&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;documentation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These labels make it easier for others to find tasks they can help with.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Add a Contributing Guide 🤝
&lt;/h2&gt;

&lt;p&gt;Having a &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; file encourages contributions by providing guidelines on how people can get involved. Include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Code of Conduct&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to submit a pull request&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coding style guidelines&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Leverage GitHub Actions for Automation 🛠️
&lt;/h2&gt;

&lt;p&gt;Automate repetitive tasks to improve user experience. Some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run tests&lt;/strong&gt; on each pull request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy your project&lt;/strong&gt; automatically (if applicable).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check code style&lt;/strong&gt; using linters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Set up a workflow file &lt;code&gt;.github/workflows/ci.yml&lt;/code&gt; to run tests on each PR.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Use &lt;a href="//shields.io"&gt;Shields.io&lt;/a&gt; Badges 🛡
&lt;/h2&gt;

&lt;p&gt;Badges add visual cues to the README, providing quick insights into your repository's status.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Badges to Add:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build Status:&lt;/strong&gt; Shows if the build is passing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License Type:&lt;/strong&gt; Displays the project's license.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Downloads Count:&lt;/strong&gt; How many times it’s been downloaded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Last Commit Date:&lt;/strong&gt; Shows activity recency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example Badge Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Build Status&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://img.shields.io/github/workflow/status/username/repo/Build&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;License&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://img.shields.io/github/license/username/repo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fimg.shields.io%2Fgithub%2Fworkflow%2Fstatus%2Fusername%2Frepo%2FBuild" 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%2Fimg.shields.io%2Fgithub%2Fworkflow%2Fstatus%2Fusername%2Frepo%2FBuild" alt="Build Status" width="312" height="20"&gt;&lt;/a&gt;&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%2Fimg.shields.io%2Fgithub%2Flicense%2Fusername%2Frepo" 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%2Fimg.shields.io%2Fgithub%2Flicense%2Fusername%2Frepo" alt="License" width="138" height="20"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Include a License 📋
&lt;/h2&gt;

&lt;p&gt;Add a license file (e.g., &lt;code&gt;LICENSE.md&lt;/code&gt;) to clarify how your project can be used, shared, and modified. Popular licenses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MIT License: Very permissive, allows for free reuse.&lt;/li&gt;
&lt;li&gt;GPL License: Ensures modifications are open-source.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub provides templates to add a license. Go to your repository's "Settings" &amp;gt; "Add License".&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Add a Project Board 🧮
&lt;/h2&gt;

&lt;p&gt;GitHub Project Boards help organize tasks and features. Create cards for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To Do&lt;/li&gt;
&lt;li&gt;In Progress&lt;/li&gt;
&lt;li&gt;Completed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives potential contributors an overview of the project's current state and what's needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  9.  Pin Your Best Repositories  📌
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;To highlight your project, pin it on your GitHub profile.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to your GitHub profile.&lt;/li&gt;
&lt;li&gt;Click "Customize your pins."&lt;/li&gt;
&lt;li&gt;Choose your project and save.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pinned repositories will appear on your profile, making them easily discoverable.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Promote on Social Media and Communities 🧭
&lt;/h2&gt;

&lt;p&gt;Share your repository on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter (use hashtags like #OpenSource, #GitHub)&lt;/li&gt;
&lt;li&gt;Reddit (subreddits like r/opensource, r/programming)&lt;/li&gt;
&lt;li&gt;LinkedIn&lt;/li&gt;
&lt;li&gt;GitHub Discussions: Engage with others and ask for feedback.&lt;/li&gt;
&lt;li&gt;Here on Dev.to&lt;/li&gt;
&lt;li&gt;Mastodon&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  11. Add a GitHub Pages Site 🌐
&lt;/h2&gt;

&lt;p&gt;Create a website for your repository with GitHub Pages. This is especially useful for documentation or live demos.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to "Settings" &amp;gt; "Pages."&lt;/li&gt;
&lt;li&gt;Choose the branch and folder for your site.&lt;/li&gt;
&lt;li&gt;Use Markdown, Jekyll, or HTML for a quick website.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  12. Regularly Update and Engage ⏳
&lt;/h2&gt;

&lt;p&gt;Stay active by updating your &lt;strong&gt;README&lt;/strong&gt;, fixing issues, and responding to pull requests. A regularly updated repository signals to others that the project is active and maintained.&lt;/p&gt;




&lt;p&gt;By following these steps, your GitHub repository will become more attractive, accessible, and engaging for users and contributors. Keep improving and spreading the word❗&lt;/p&gt;

</description>
      <category>github</category>
      <category>beginners</category>
      <category>git</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Update Cursor AI on Linux</title>
      <dc:creator>Kosa Matyas</dc:creator>
      <pubDate>Mon, 04 Nov 2024 19:56:57 +0000</pubDate>
      <link>https://dev.to/kosa12/update-cursor-ai-on-linux-a0h</link>
      <guid>https://dev.to/kosa12/update-cursor-ai-on-linux-a0h</guid>
      <description>&lt;h2&gt;
  
  
  Cursor Update Script for Arch Linux
&lt;/h2&gt;

&lt;p&gt;This script automates the installation and updating of the Cursor application on your Arch Linux system. It downloads the latest version of the Cursor AppImage, makes it executable, and creates a desktop entry for easy access from your application menu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Link to the code:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/kosa12/cursor_update/blob/main/cursor_update.sh" rel="noopener noreferrer"&gt;cursor_update.sh&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Automatically fetches the latest version of Cursor.&lt;/li&gt;
&lt;li&gt;Checks for existing installations and updates if a new version is available.&lt;/li&gt;
&lt;li&gt;Creates a desktop entry for easy access.&lt;/li&gt;
&lt;li&gt;Downloads the application icon if not already present.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arch Linux&lt;/strong&gt;: This script is designed for Arch Linux systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Curl&lt;/strong&gt;: The script requires &lt;code&gt;curl&lt;/code&gt; to download files. If you don't have &lt;code&gt;curl&lt;/code&gt; installed, you can install it using the following command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; curl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installation Instructions
&lt;/h2&gt;

&lt;p&gt;Follow these steps to install or update the Cursor application on your Arch Linux system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clone the Repository&lt;/strong&gt; (if applicable) or download the script directly:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git clone https://github.com/kosa12/cursor_update
   &lt;span class="nb"&gt;cd &lt;/span&gt;https://github.com/kosa12/cursor_update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Make the Script Executable&lt;/strong&gt;: Open a terminal and run the following command to make the installation script executable:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x cursor_update.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Run the script&lt;/strong&gt;: Execute the script to install or update Cursor:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./cursor_update.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Launch Cursor&lt;/strong&gt;: In the application menu on your computer should be the Cursor program now&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>tutorial</category>
      <category>ai</category>
      <category>linux</category>
      <category>cursor</category>
    </item>
    <item>
      <title>How to install Cursor IDE on Arch linux</title>
      <dc:creator>Kosa Matyas</dc:creator>
      <pubDate>Sun, 03 Nov 2024 15:19:15 +0000</pubDate>
      <link>https://dev.to/kosa12/how-to-install-cursor-on-arch-linux-2313</link>
      <guid>https://dev.to/kosa12/how-to-install-cursor-on-arch-linux-2313</guid>
      <description>&lt;p&gt;How to install Cursor AI on Arch linux? Simple, follow these steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Go to &lt;a href="https://www.cursor.com/" rel="noopener noreferrer"&gt;Cursor's website&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Press &lt;em&gt;Download for free&lt;/em&gt; (it should download an &lt;code&gt;.Appimage&lt;/code&gt; file)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Navigate to the file and run &lt;code&gt;chmod +x cursor-&amp;lt;version_number&amp;gt;.Appimage&lt;/code&gt; to make it executable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Run &lt;code&gt;./cursor-&amp;lt;version_number&amp;gt;.Appimage&lt;/code&gt; to make sure it starts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. If yes, add it to the application list with &lt;code&gt;sudo mv cursor-&amp;lt;version_number&amp;gt;.AppImage ~/opt/cursor.appimage&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Make a desktop entry for the app&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo nano /usr/share/applications/cursor.desktop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt; CTRL + V this into the file:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  [Desktop Entry]
  Name=Cursor
  Exec=/opt/cursor.appimage
  Icon=/opt/cursor.png
  Type=Application
  Categories=Development;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;7. Save the file, move the icon cursor.png of your choice to &lt;code&gt;~/opt/&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. You are done!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>cursor</category>
      <category>archlinux</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Java Chess with server and client</title>
      <dc:creator>Kosa Matyas</dc:creator>
      <pubDate>Mon, 12 Feb 2024 15:06:33 +0000</pubDate>
      <link>https://dev.to/kosa12/java-chess-with-server-and-client-1fdi</link>
      <guid>https://dev.to/kosa12/java-chess-with-server-and-client-1fdi</guid>
      <description>&lt;p&gt;Hi guys, today I finished my Chess game in Java with server and client features! Let me know what you think, and what should I implement or correct. Or any general tip would be good :)&lt;/p&gt;

&lt;p&gt;And if you like it, give it a star on GitHub :3&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kosa12/MultiplayerChess" rel="noopener noreferrer"&gt;https://github.com/kosa12/MultiplayerChess&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>showdev</category>
      <category>java</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Java Slot Machine</title>
      <dc:creator>Kosa Matyas</dc:creator>
      <pubDate>Fri, 05 Jan 2024 18:29:14 +0000</pubDate>
      <link>https://dev.to/kosa12/java-slot-machine-2jmi</link>
      <guid>https://dev.to/kosa12/java-slot-machine-2jmi</guid>
      <description>&lt;p&gt;I built a cyberpunk-themed slot machine game using Java: &lt;br&gt;
&lt;a href="https://github.com/kosa12/SlotMachine" rel="noopener noreferrer"&gt;https://github.com/kosa12/SlotMachine&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to comment on anything, correct me if I've made a mistake. &lt;br&gt;
I am new to this, this is my first big project ever.&lt;/p&gt;

</description>
      <category>java</category>
      <category>beginners</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
