<?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: blueberries</title>
    <description>The latest articles on DEV Community by blueberries (@blueberries4).</description>
    <link>https://dev.to/blueberries4</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%2F1221132%2F0af8fe43-81f2-4dd4-a7df-bb12fffd2cb5.jpeg</url>
      <title>DEV Community: blueberries</title>
      <link>https://dev.to/blueberries4</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/blueberries4"/>
    <language>en</language>
    <item>
      <title>How to Bulk Withdraw Sent LinkedIn Invitations with a Free Chrome Extension</title>
      <dc:creator>blueberries</dc:creator>
      <pubDate>Wed, 25 Feb 2026 18:02:03 +0000</pubDate>
      <link>https://dev.to/blueberries4/how-to-bulk-withdraw-sent-linkedin-invitations-with-a-free-chrome-extension-2ek7</link>
      <guid>https://dev.to/blueberries4/how-to-bulk-withdraw-sent-linkedin-invitations-with-a-free-chrome-extension-2ek7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Stuck with hundreds of pending LinkedIn connection requests you never got a reply to? Here's the fastest way to clean them all up automatically.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;ul&gt;
&lt;li&gt;The Problem&lt;/li&gt;
&lt;li&gt;The Solution&lt;/li&gt;
&lt;li&gt;Who Is This For?&lt;/li&gt;
&lt;li&gt;Step-by-Step Guide&lt;/li&gt;
&lt;li&gt;FAQ&lt;/li&gt;
&lt;li&gt;Why I Built This&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Problem: LinkedIn Makes Bulk Withdrawal Painful
&lt;/h2&gt;

&lt;p&gt;LinkedIn doesn't allow you to remove multiple sent invites at once, which makes cleaning old connection requests slow and frustrating.&lt;/p&gt;

&lt;p&gt;If you've ever sent connection requests during outreach campaigns, job hunting, or networking drives, you could be sitting on &lt;strong&gt;hundreds or thousands&lt;/strong&gt; of unaccepted invitations.&lt;/p&gt;

&lt;p&gt;There's no built-in "Select All → Withdraw" feature on LinkedIn. Until now.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: LinkedIn Invite Cleaner (Chrome Extension)
&lt;/h2&gt;

&lt;p&gt;I built a &lt;strong&gt;free Chrome extension&lt;/strong&gt; that automatically withdraws all your pending sent LinkedIn invitations — no manual clicking required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/linkedin-invite-cleaner/dmobinfdplihjdjppakcoeejgkkiaijd" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;⚡ Install LinkedIn Invite Cleaner — It's Free&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Automatically scrolls through your sent invitations list&lt;/li&gt;
&lt;li&gt;✅ Bulk withdraws pending LinkedIn invitations by age and batch size&lt;/li&gt;
&lt;li&gt;✅ Works quietly — no setup needed&lt;/li&gt;
&lt;li&gt;✅ Saves you hours of repetitive clicking&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Who Is This For?
&lt;/h2&gt;

&lt;p&gt;This extension is perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn users&lt;/strong&gt; who regularly do outreach and accumulate unanswered invites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job seekers&lt;/strong&gt; who sent mass connection requests and want a fresh start&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marketers &amp;amp; founders&lt;/strong&gt; who hit LinkedIn's invitation limits and need to reset&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone&lt;/strong&gt; who wants to keep their LinkedIn network clean and intentional&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Use It: Step by Step
&lt;/h2&gt;

&lt;p&gt;In this guide, I'll show you how to automatically withdraw pending LinkedIn invites using a free Chrome extension in just a few clicks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install the LinkedIn Invite Cleaner Extension
&lt;/h3&gt;

&lt;p&gt;Go to the Chrome Web Store and install &lt;strong&gt;LinkedIn Invite Cleaner&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&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%2Foxi3yfcm8n2nrxutxjok.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%2Foxi3yfcm8n2nrxutxjok.png" alt="LinkedIn Invite Cleaner Chrome extension on the Chrome Web Store"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 2: Open LinkedIn and Go to "My Network"
&lt;/h3&gt;

&lt;p&gt;Navigate to &lt;a href="https://www.linkedin.com/mynetwork/invitation-manager/sent/" rel="noopener noreferrer"&gt;linkedin.com/mynetwork/invitation-manager/sent/&lt;/a&gt; — this is the page that lists all your &lt;strong&gt;sent, pending LinkedIn connection requests&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&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%2Fzcbsex4basppglwkepua.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%2Fzcbsex4basppglwkepua.png" alt="LinkedIn Sent Invitations Manager page showing a list of pending connection requests"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 3: Click the Extension Icon in Chrome
&lt;/h3&gt;

&lt;p&gt;Click the &lt;strong&gt;LinkedIn Invite Cleaner&lt;/strong&gt; icon in your Chrome toolbar to open the extension popup.&lt;/p&gt;

&lt;blockquote&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%2Fz4tfg9aa7z7xln3ob9em.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%2Fz4tfg9aa7z7xln3ob9em.png" alt="LinkedIn Invite Cleaner extension popup opened from the Chrome toolbar"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 4: Configure Settings and Hit "Start"
&lt;/h3&gt;

&lt;p&gt;Before running, set your two options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🗓️ Invite Age Filter&lt;/strong&gt; — Choose how old invitations must be before they're withdrawn (1–12 months). This ensures you never accidentally remove a fresh request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔢 Batch Size&lt;/strong&gt; — Choose how many invitations to withdraw per run (2–50). Start small to be cautious, or go higher to clean up faster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once configured, click the &lt;strong&gt;Start&lt;/strong&gt; button. The extension will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Automatically scroll down to load all pending invitations&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Withdraw&lt;/em&gt; on each matching invite, one after another&lt;/li&gt;
&lt;li&gt;Confirm each withdrawal dialog automatically&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&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%2Fkh54lm8yhog4sfp7b5dn.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%2Fkh54lm8yhog4sfp7b5dn.png" alt="LinkedIn Invite Cleaner extension popup showing the invite age filter and batch size settings"&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktja4v0ye9p5579d23bw.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%2Fktja4v0ye9p5579d23bw.png" alt="LinkedIn Invite Cleaner Chrome extension automatically withdrawing pending sent invitations"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 5: Review Your Results ✅
&lt;/h3&gt;

&lt;p&gt;Once the run is complete, the extension will have withdrawn invitations based on your configured settings.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you set a &lt;strong&gt;large batch size&lt;/strong&gt; with a &lt;strong&gt;wide age filter&lt;/strong&gt;, you'll see a significant chunk of your list cleared out&lt;/li&gt;
&lt;li&gt;If you set a &lt;strong&gt;smaller batch size&lt;/strong&gt;, only that number of invitations will be withdrawn this run — simply run it again to continue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You're in full control. Run it as many times as needed until your pending invitations list is exactly where you want it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;
  Is this safe to use?
  &lt;br&gt;
The extension only interacts with the LinkedIn page that's already open in your browser. It simulates the same clicks you would make manually — just much faster. No credentials or data are ever collected.&lt;br&gt;


&lt;/p&gt;

&lt;p&gt;
  Will my LinkedIn account get banned?
  &lt;br&gt;
The extension paces withdrawals at a natural speed to avoid triggering LinkedIn's bot detection. That said, always use it responsibly and avoid running extremely large batches repeatedly in a short time.&lt;br&gt;


&lt;/p&gt;

&lt;p&gt;
  Does it work on all LinkedIn plans?
  &lt;br&gt;
Yes — it works on free LinkedIn accounts as well as LinkedIn Premium.&lt;br&gt;


&lt;/p&gt;

&lt;p&gt;
  How many invitations can it withdraw at once?
  &lt;br&gt;
It will process pending invitations based on the batch size limit you select (2–50 per run). Run it multiple times to clear out larger lists.&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I personally ran into this problem while doing a networking push. I ended up with 100+ unanswered invites that were blocking me from sending new ones. LinkedIn's UI made it impossibly tedious to clean up.&lt;/p&gt;

&lt;p&gt;After spending way too long clicking &lt;em&gt;Withdraw&lt;/em&gt; manually, I decided to build a proper solution. Turns out, this is a super common problem for anyone who uses LinkedIn actively.&lt;/p&gt;

&lt;p&gt;If this saves you time too, a ⭐ on the extension would mean a lot!&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;strong&gt;Chrome Extension&lt;/strong&gt;: &lt;a href="https://chromewebstore.google.com/detail/linkedin-invite-cleaner/dmobinfdplihjdjppakcoeejgkkiaijd?" rel="noopener noreferrer"&gt;Install LinkedIn Invite Cleaner&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;LinkedIn Post&lt;/strong&gt;: &lt;a href="https://www.linkedin.com/posts/raparthisk_chromeextension-linkedin-productivitytools-ugcPost-7432464839408615425-xegQ" rel="noopener noreferrer"&gt;Original announcement&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐛 &lt;strong&gt;Found a bug?&lt;/strong&gt; Drop a comment below or reach out on LinkedIn&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;If you found this helpful, share it with anyone who's drowning in pending LinkedIn invites. Let's save some clicks! 🙌&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linkedin</category>
      <category>productivity</category>
      <category>chrome</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Host an Express App on AWS EC2 with NGINX (Free Tier Guide)</title>
      <dc:creator>blueberries</dc:creator>
      <pubDate>Fri, 02 May 2025 05:00:59 +0000</pubDate>
      <link>https://dev.to/blueberries4/how-to-host-an-express-app-on-aws-ec2-with-nginx-free-tier-guide-3bd6</link>
      <guid>https://dev.to/blueberries4/how-to-host-an-express-app-on-aws-ec2-with-nginx-free-tier-guide-3bd6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hey there, developer! 🚀&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Want to take your Node.js app live? This hands-on guide shows how to deploy a simple URL shortener app built with Express.js on a free AWS EC2 instance, using NGINX as a reverse proxy&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table of contents&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is AWS EC2?&lt;/li&gt;
&lt;li&gt;What is NGINX?&lt;/li&gt;
&lt;li&gt;Step 1: Launching an EC2 Instance&lt;/li&gt;
&lt;li&gt;Step 2: Connect to Your EC2 Instance via SSH&lt;/li&gt;
&lt;li&gt;Step 3: Install NGINX and Deploy App&lt;/li&gt;
&lt;li&gt;Step 4: Configure NGINX to Reverse Proxy to Node.js&lt;/li&gt;
&lt;li&gt;Test the URL Shortener&lt;/li&gt;
&lt;li&gt;Wrapping Up&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What is AWS EC2 (in simple terms):
&lt;/h2&gt;

&lt;p&gt;Amazon EC2 (Elastic Compute Cloud)** is a service from AWS that lets you run virtual computers in the cloud. Instead of buying and managing physical servers, you can use EC2 to quickly set up and run a server whenever you need it. You can choose the size, operating system, and location of your server, and you only pay for what you use. It’s great for hosting websites, apps, or testing software without needing your own hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is nginx
&lt;/h2&gt;

&lt;p&gt;Nginx (pronounced "engine-x") is a free, open-source web server that is used to serve websites and web apps. It’s known for being fast, reliable, and able to handle a lot of traffic. Nginx can also be used as a reverse proxy, which means it can sit in front of your application (like a Node.js app) and forward requests to it, helping with things like load balancing, security, and caching. It’s a popular tool for making websites faster and more secure.&lt;/p&gt;

&lt;p&gt;Sign in to your &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;AWS&lt;/a&gt; account. If you’re new to AWS, you can &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;sign up&lt;/a&gt; for the free tier to get started without any upfront cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Launching an EC2 Instance on AWS (Step-by-Step)
&lt;/h2&gt;

&lt;p&gt;Once you're logged into your &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;AWS&lt;/a&gt; Console, type EC2 in the search bar at the top and click on the EC2 option that appears.&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%2Ff0poqgotltvvxxnu0p2z.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%2Ff0poqgotltvvxxnu0p2z.png" alt="AWS search bar" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, click on the Launch instance button to start the setup process.&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%2F6qmzenj04vh4drdpbtom.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%2F6qmzenj04vh4drdpbtom.png" alt="EC2 instance home page" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Launching an EC2 Instance
&lt;/h2&gt;

&lt;p&gt;Start by giving your instance a unique name that helps you identify it easily. Then, under the operating system section, choose Amazon Linux AMI. It’s part of the free tier and is a great choice for most general-purpose use cases.&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%2Fecumyc4czwl91a1fgao7.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%2Fecumyc4czwl91a1fgao7.png" alt="EC2 instance creation page" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👤 &lt;strong&gt;Know Your Default Username and Choose the Right Instance Type&lt;/strong&gt;&lt;br&gt;
Since we’ve selected Amazon Linux AMI, the default SSH username will be &lt;strong&gt;ec2-user&lt;/strong&gt; make sure to note that down, as you’ll need it when connecting to your instance later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For the instance type&lt;/strong&gt;, go with t2.micro. It’s part of the AWS Free Tier and is a solid choice for testing, development, or running lightweight apps without incurring costs.&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%2Fdow8gnqrqoajya0z5ao9.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%2Fdow8gnqrqoajya0z5ao9.png" alt="EC2 instance creation page" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;Key Pair for SSH Access&lt;/strong&gt;&lt;br&gt;
To securely connect to your instance using SSH, you’ll need a .pem file—this is your private key that grants access to the EC2 instance.&lt;/p&gt;

&lt;p&gt;If you don’t already have one, no worries! Just create a new Key Pair during the setup process. Give it a recognizable name, select .pem as the file format, and then download it immediately.&lt;/p&gt;

&lt;p&gt;⚠️ &lt;em&gt;Important: You’ll only get one chance to download the .pem file. Store it in a safe, accessible location—you’ll need it every time you SSH into your instance.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This key is essential for authenticating your access later using a terminal or an SSH client.&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%2Fm28h79pnvduo672g0qsq.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%2Fm28h79pnvduo672g0qsq.png" alt="EC2 instance creation page" width="800" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔒 &lt;strong&gt;Configure Security Group (Your Virtual Firewall)&lt;/strong&gt;&lt;br&gt;
Next, it’s time to set up your Security Group, which acts like a virtual firewall controlling both inbound and outbound traffic to your instance.&lt;/p&gt;

&lt;p&gt;For basic access, make sure to enable the following:&lt;/p&gt;

&lt;p&gt;SSH (port 22) – so you can connect to the instance via terminal&lt;/p&gt;

&lt;p&gt;HTTP (port 80) – for serving web traffic over an unsecured connection&lt;/p&gt;

&lt;p&gt;HTTPS (port 443) – for secure web traffic&lt;/p&gt;

&lt;p&gt;You can either create a new security group or reuse an existing one. If you plan on launching more instances with similar rules in the future, reusing the security group can save time.&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%2Fxo6vleir7hjixhazz8zh.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%2Fxo6vleir7hjixhazz8zh.png" alt="EC2 instance creation page" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💾 &lt;strong&gt;Configure Storage and Launch Your Instance&lt;/strong&gt;&lt;br&gt;
You can go ahead and stick with the default storage settings—they're usually sufficient for most basic use cases.&lt;/p&gt;

&lt;p&gt;Once that’s done, simply click on Launch Instance!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That’s it—your EC2 instance is now up and running 🚀&lt;/strong&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%2Fwbbl4db7hbmwe0o70hc1.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%2Fwbbl4db7hbmwe0o70hc1.png" alt="EC2 instance creation page" width="800" height="435"&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%2Fv07e6fekh5bqkzdyu8f1.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%2Fv07e6fekh5bqkzdyu8f1.png" alt="EC2 instance dashboard" width="800" height="168"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Connect to Your EC2 Instance via SSH
&lt;/h2&gt;

&lt;p&gt;To connect to your EC2 instance, you’ll need the .pem file you generated earlier—this acts as your private key for secure access.&lt;/p&gt;

&lt;p&gt;Mac or Linux users: You can simply use the terminal. Just make sure your .pem file has the correct permissions and run the SSH command (we'll cover that shortly).&lt;/p&gt;

&lt;p&gt;Windows users: You’ll need an SSH client like MobaXterm or PuTTY, which comes with built-in SSH support.&lt;/p&gt;

&lt;p&gt;If you're new to connecting EC2 instances on Windows, check out this detailed guide by Kedar Makode: &lt;a href="https://www.freecodecamp.org/news/connect-to-your-ec2-instance-using-mobaxterm/" rel="noopener noreferrer"&gt;How to Connect to EC2 Using MobaXterm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;He walks through everything from setup to successful connection—super helpful for first-timers!&lt;/p&gt;

&lt;p&gt;To connect to your EC2 instance from a Mac or Linux terminal, use the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ssh -i "your-key.pem" ec2-user@your-ec2-public-ip&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Replace your-key.pem with the name of your downloaded key file&lt;br&gt;
Replace your-ec2-public-ip with the Public IPv4 address of your instance, you can find it in instance dashboard&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%2Frre8i6k03nmwiu3gg927.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%2Frre8i6k03nmwiu3gg927.png" alt="EC2 instance dashboard" width="800" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;that’s it—you’re now connected to your EC2 server in the cloud!&lt;/strong&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%2Fvpwvau92rv0l1uya8sga.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%2Fvpwvau92rv0l1uya8sga.png" alt="EC2 Connected via SSH" width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Install NGINX and Deploy App
&lt;/h2&gt;

&lt;p&gt;Before jumping into deploying our app, let’s install and configure Nginx—this will help us route traffic to our Node.js app later.&lt;/p&gt;

&lt;p&gt;Run the following command to update all system packages:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo dnf update -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now install the Nginx server with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo dnf install nginx -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Once installed, start the Nginx server:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl start nginx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To verify it’s running, head over to your EC2 instance's public IP in the browser using &lt;a href="http://your-ec2-public-ip" rel="noopener noreferrer"&gt;http://your-ec2-public-ip&lt;/a&gt;, and you should see the default Nginx welcome page:&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%2Fs8jl2vrt3d8s4dawkbi4.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%2Fs8jl2vrt3d8s4dawkbi4.png" alt="Default nginx home page" width="800" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clone the URL Shortener App&lt;/strong&gt;&lt;br&gt;
Let’s deploy the &lt;a href="https://github.com/blueberries4/url-shortener" rel="noopener noreferrer"&gt;url-shortener repo&lt;/a&gt; from GitHub.&lt;/p&gt;

&lt;p&gt;This is a basic project where we’re storing the URLs in a Map object, so the data isn’t persistent. That means once the Node.js app stops, the data is gone. But as long as your Node.js app is running, everything works just fine!&lt;/p&gt;

&lt;p&gt;🔧 Install Node.js and Git&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo dnf install nodejs -y&lt;br&gt;
sudo dnf install git -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📁 Clone the Repository&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git clone https://github.com/blueberries4/url-shortener.git&lt;br&gt;
cd url-shortener&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install the project dependencies:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📝 Update Environment Variables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We need to modify the .env file to reflect your EC2 public IP instead of localhost. Open it using:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo nano .env&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Replace localhost:3000 with your EC2 public IP and save the file.&lt;/p&gt;

&lt;p&gt;🔐 Note: Never commit .env files with sensitive information to version control, especially in production environments.&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%2Fjleabr90yloo95sbaj4v.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%2Fjleabr90yloo95sbaj4v.png" alt="package json file" width="738" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 Run the App&lt;/strong&gt;&lt;br&gt;
Now start the Node.js app:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;node server.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;However, you still won’t be able to access it publicly until we configure Nginx to properly reverse proxy traffic to your app. That’s coming up next!&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4: Configure NGINX to Reverse Proxy to Node.js
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;📁 Create a New Nginx Config File&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a new config file in /etc/nginx/conf.d/. You can name it anything, like app.conf:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo nano /etc/nginx/conf.d/app.conf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Paste the following configuration:&lt;/p&gt;

&lt;p&gt;This configuration forwards all incoming requests on port 80 to our Node.js app running on port 3000.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
    listen 80;
    server_name _;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

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

&lt;/div&gt;



&lt;p&gt;🔄 Restart Nginx&lt;br&gt;
&lt;code&gt;sudo systemctl restart nginx&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the URL Shortener
&lt;/h2&gt;

&lt;p&gt;✅ Verify It’s Working&lt;/p&gt;

&lt;p&gt;Make sure your Node.js app is still running:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;node server.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Go to your EC2 instance's public IP in the browser:&lt;br&gt;
&lt;a href="http://your-ec2-public-ip" rel="noopener noreferrer"&gt;http://your-ec2-public-ip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should now see your Node.js app instead of the Nginx default page!&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%2Fgwdnxc1saqdgoc6rbrjq.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%2Fgwdnxc1saqdgoc6rbrjq.png" alt="URL Shortener home page" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can try it with any URL — just paste it in, and it’ll generate a short version for you. When you access that short URL, it will redirect you back to the original one.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Wrapping Up
&lt;/h2&gt;

&lt;p&gt;And that’s it — you’ve now successfully launched a Node.js app on an EC2 instance, configured Nginx to route traffic, and built a working URL shortener! While this project uses in-memory storage for simplicity, it’s a solid foundation to build on. Next steps? Hook it up to a database, add user authentication, or even deploy it behind HTTPS with a custom domain.&lt;/p&gt;

&lt;p&gt;✅ Don’t forget: If you’re just experimenting and no longer need the EC2 instance, make sure to stop or terminate it from the AWS console to avoid any unwanted charges. Also release any Elastic IPs you’re no longer using.&lt;/p&gt;

&lt;p&gt;Keep experimenting and happy coding! 💻🌐&lt;/p&gt;

</description>
      <category>aws</category>
      <category>nginx</category>
      <category>node</category>
      <category>ec2</category>
    </item>
  </channel>
</rss>
