<?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: Kyle Y. Parsotan</title>
    <description>The latest articles on DEV Community by Kyle Y. Parsotan (@kyl67899).</description>
    <link>https://dev.to/kyl67899</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1030428%2F3c52281d-a355-4c87-b03e-1982eebc13a5.png</url>
      <title>DEV Community: Kyle Y. Parsotan</title>
      <link>https://dev.to/kyl67899</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kyl67899"/>
    <language>en</language>
    <item>
      <title>Meta VR Start Developer Competition 2026</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Thu, 12 Nov 2026 18:27:44 +0000</pubDate>
      <link>https://dev.to/kyl67899/meta-developer-hackathon-4e9</link>
      <guid>https://dev.to/kyl67899/meta-developer-hackathon-4e9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/mlh-hackathon"&gt;MLH x DEV Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;IRON FRONT VR — Operation Black Iron&lt;br&gt;
A Call of Duty-style first-person shooter for Meta Quest (WebXR in the Quest Browser) that also plays on desktop with mouse and keyboard. It has an open world, a 5-mission story campaign, round-based Zombies, Training, a squad mode and a Mixed Reality drill. &lt;/p&gt;

&lt;p&gt;Enemies, squadmates and zombies are realistic skinned human characters with real walk, run and idle animations. Their arms are posed live with inverse kinematics, so soldiers actually aim their rifles at you.&lt;/p&gt;

&lt;p&gt;Built with Meta's Immersive Web SDK&lt;br&gt;
This project was generated with npm create @iwsdk@latest (IWSDK 1.1.0-rc.2, three.js via super-three r185) and the game was wired into it. If you'd rather stay on the last stable release, set @iwsdk/core, @iwsdk/cli and @iwsdk/vite-plugin-dev to 1.0.1 and three to npm:&lt;a href="mailto:super-three@0.181.0"&gt;super-three@0.181.0&lt;/a&gt; in package.json; the game works on both.&lt;/p&gt;

&lt;p&gt;The game runs inside an IWSDK World (src/index.js). IWSDK owns the renderer, scene, player rig, XR session, controller input and frame loop, and the game is registered as an ECS System. It's configured in iwsdk.config.json (VR mode, local-floor, 75° FOV, 900 m far plane, Quest 3 emulator).&lt;/p&gt;

&lt;p&gt;Ship to the Meta Horizon Store (immersive PWA)&lt;br&gt;
The app is already prepared: there's public/manifest.webmanifest, the 192, 512 and maskable icons, and an auto-enter-VR step in src/index.js that runs only when installed as a Quest app (it's gated on getDigitalGoodsService). Browser tabs keep the Enter VR button.&lt;/p&gt;

&lt;p&gt;Host it on a stable HTTPS origin, for example &lt;a href="https://iron-front-vr.vercel.app" rel="noopener noreferrer"&gt;https://iron-front-vr.vercel.app&lt;/a&gt;, not a preview or tunnel URL.&lt;/p&gt;

&lt;p&gt;Install Meta's bubblewrap with npm i -g @meta-quest/bubblewrap-cli, then run bubblewrap doctor once in a terminal and accept the JDK and Android SDK installs.&lt;/p&gt;

&lt;p&gt;Create a signing key and keep it forever. You can't update the app without it: keytool -genkeypair -v -keystore twa/android.keystore -alias android -keyalg RSA -keysize 2048 -validity 10000&lt;br&gt;
Copy twa/twa-manifest.template.json to twa/twa-manifest.json and fill in your domain, keystore path and (later) your Horizon App ID. Keep "isMetaQuest": true and "horizonOSAppMode": "immersive".&lt;/p&gt;

&lt;p&gt;Build the APK: cd twa &amp;amp;&amp;amp; BUBBLEWRAP_KEYSTORE_PASSWORD=… BUBBLEWRAP_KEY_PASSWORD=… bubblewrap update &amp;amp;&amp;amp; bubblewrap build&lt;br&gt;
Digital Asset Links: copy twa/assetlinks.template.json to public/.well-known/assetlinks.json with your keystore's SHA-256 (keytool -list -v -keystore twa/android.keystore), rebuild and redeploy. The Quest app won't launch until this URL is live.&lt;/p&gt;

&lt;p&gt;Sideload and test with adb install -r twa/app-release-signed.apk, then upload to the Store with Meta's ovr-platform-util upload-quest-build --app-id … --app-secret … --apk app-release-signed.apk --channel ALPHA.&lt;/p&gt;

&lt;p&gt;Web-only changes (gameplay, art, levels) only need a redeploy. The installed app loads the live site. You only rebuild the APK for package or name changes, the icon, version or signing.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://iron-front-vr.vercel.app/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;iron-front-vr.vercel.app&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Partner Technologies
&lt;/h2&gt;

&lt;p&gt;Meta VR Developer website, Major League Hackathon&lt;/p&gt;

&lt;h2&gt;
  
  
  Hackathon Experience
&lt;/h2&gt;

&lt;p&gt;This project is still in development and being tested for production however it is viewable via the web and VR. Built with Meta's Immersive Web SDK.&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>Devpost - Build, Ship, Shape: Amazon Developer Hackathon Build across Amazon Devices and shape what's next.</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Mon, 26 Oct 2026 20:49:06 +0000</pubDate>
      <link>https://dev.to/kyl67899/devpost-build-ship-shape-amazon-developer-hackathon-build-across-amazon-devices-and-shape-48bg</link>
      <guid>https://dev.to/kyl67899/devpost-build-ship-shape-amazon-developer-hackathon-build-across-amazon-devices-and-shape-48bg</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/mlh-hackathon"&gt;MLH x DEV Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;An AI-enhanced living-room workout coach for Amazon Fire TV devices running Vega OS, monetized through Amazon In-App Purchasing (IAP). Workouts adapt to the time you have, your experience and your equipment, with no camera. Everything is driven by the Fire TV remote.&lt;/p&gt;

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

&lt;p&gt;This is a competition so no compensation was paid out and this TV app was not deployed in production.&lt;/p&gt;

&lt;p&gt;Demo video:&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/wjBvINln7uE" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Github Repo:&lt;br&gt;
&lt;a href="https://github.com/Kyl67899/DevPost_Hackathon_AmazonFireTV" rel="noopener noreferrer"&gt;https://github.com/Kyl67899/DevPost_Hackathon_AmazonFireTV&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I learned how to apply react native to build not only a hybrid platfomr but an app for the TV as well. I was able to use the amazon provided template and some videos on youtube to think through how to use the emulator and the knowledge of react-native and web development to build an app called FitPilot TV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Partner Technologies
&lt;/h2&gt;

&lt;p&gt;I used Amazon Vega OS extension to build the react native TV app, claude AI assistant, and Amazon vega OS template to help me with getting started and submnit my work by the given deadline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hackathon Experience
&lt;/h2&gt;

&lt;p&gt;I attended the online Amazon Developer Hackathon event which allowed me to pick a track such as Fire TV, Alexa+, Bee, or Ring. I used the resources for building the app for the Vega OS TV, reviewed the track details and requirements, and submitted my work by the deadline.&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>Extern - Wayfair's AI Automation</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Sun, 25 Oct 2026 04:54:42 +0000</pubDate>
      <link>https://dev.to/kyl67899/extern-wayfairs-ai-automation-4n55</link>
      <guid>https://dev.to/kyl67899/extern-wayfairs-ai-automation-4n55</guid>
      <description>&lt;p&gt;I built an AI Automation that would be able to spy on Wayfair's products here is how I built the four automations.&lt;/p&gt;

&lt;p&gt;I used the n8n local environment with Dockers to be able to run the local environment. Read more &lt;a href="https://docs.n8n.io/deploy/host-n8n/install-options/install-with-docker" rel="noopener noreferrer"&gt;here&lt;/a&gt; on how to setup the n8n locally with Dockers.&lt;/p&gt;

&lt;p&gt;Project 1 MoodBoard Generator - with n8n and different LLM models to generate the images. Understand how to be very descriptive in the prompts when prompting the LLM. &lt;/p&gt;

&lt;p&gt;Project 2 Building the Consumer Trend Discovery AI Agent - Spot product trends before they go mainstream. Build an AI system that scans real world data sources such as Amazon and design blogs to identify what's rising in popularity and why. Build the foundation of a Consumer Trend Discovery AI Agent that helps Wayfair detec emerging design and product trends faster than traditional research teams, the kind of insight that drives smarter merchandising and faster product decisions. &lt;/p&gt;

&lt;p&gt;Project 3 - Market Trend Discovery Agent Demo and HTML Reports:&lt;br&gt;
&lt;a href="https://www.loom.com/share/9f1010b088364d14b242afd497194d42" rel="noopener noreferrer"&gt;https://www.loom.com/share/9f1010b088364d14b242afd497194d42&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Project 4 - Content Strategy Generator v4 (Premium+) - Kyle Parsotan Demo: &lt;br&gt;
&lt;a href="https://www.loom.com/share/2768243fd9ea47d1bd086278f7b071e9" rel="noopener noreferrer"&gt;https://www.loom.com/share/2768243fd9ea47d1bd086278f7b071e9&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built multiple AI Agents using n8n, enabling automated workflows for trend detection, competitor tracking, and marketing content generation.&lt;/p&gt;

&lt;p&gt;Conducted in-depth trend analysis across the home good sector, identifying patterns in consumer demand, style preferences, and design narratives; tracked competitor pricing, launches, and campaigns to extract structured insights.&lt;/p&gt;

&lt;p&gt;Consolidated agent outputs into a live updating google sheets dashboard, integrating trend signals, competitive benchmarks and AI generated insights to support category decision-making.&lt;/p&gt;

&lt;p&gt;Github repo: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Kyl67899" rel="noopener noreferrer"&gt;
        Kyl67899
      &lt;/a&gt; / &lt;a href="https://github.com/Kyl67899/Wayfair-n8n-AI-Agent-Engineering-Externship" rel="noopener noreferrer"&gt;
        Wayfair-n8n-AI-Agent-Engineering-Externship
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Extern - Wayfair AI Automation built with n8n and AI agent to help with the program manager with their data
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Wayfair Internship - AI Automation Engineer - Extern Core Projects&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Project 1: Creating a Moodboard Agent that connects design ideas to visuals&lt;/h3&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Level: Easy&lt;/li&gt;
&lt;li&gt;Tech stack: n8n and AI or LLM&lt;/li&gt;
&lt;li&gt;Description:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Project 2: Discovering Market Demand and Trends Across Products, Blogs, and Social Media&lt;/h3&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Level: Medium&lt;/li&gt;
&lt;li&gt;Tech stack: n8n and AI or LLM&lt;/li&gt;
&lt;li&gt;Description:
&lt;ul&gt;
&lt;li&gt;Google Docs: &lt;a href="https://docs.google.com/document/d/1y27bot3OTBOwsa_7k50HRN5ef1Y82OS9eWZPa7-gMpQ/edit?usp=sharing" rel="nofollow noopener noreferrer"&gt;https://docs.google.com/document/d/1y27bot3OTBOwsa_7k50HRN5ef1Y82OS9eWZPa7-gMpQ/edit?usp=sharing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Loom Video: &lt;a href="https://www.loom.com/share/9f1010b088364d14b242afd497194d42" rel="nofollow noopener noreferrer"&gt;https://www.loom.com/share/9f1010b088364d14b242afd497194d42&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Project 3: Benchmarking Competitors to find Whitespace Opportunities&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Level: Medium&lt;/li&gt;
&lt;li&gt;Tech stack: n8n and AI or LLM&lt;/li&gt;
&lt;li&gt;Description:
&lt;ul&gt;
&lt;li&gt;Google Docs: &lt;a href="https://docs.google.com/document/d/1LtzChW81r2xWH9tWFZ4Ga_iLp1SmyqZH0JjKV1QTalQ/edit?usp=sharing" rel="nofollow noopener noreferrer"&gt;https://docs.google.com/document/d/1LtzChW81r2xWH9tWFZ4Ga_iLp1SmyqZH0JjKV1QTalQ/edit?usp=sharing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Loom video: Coming Soon&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Project 4: Generating AI-driven Insights and Marketing Content Ideas&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Level: Medium&lt;/li&gt;
&lt;li&gt;Tech stack: n8n and AI or LLM&lt;/li&gt;
&lt;li&gt;Description:
&lt;ul&gt;
&lt;li&gt;Google Docs: &lt;a href="https://docs.google.com/document/d/11fzEWNcZdMXvBP4yIzxC_ENR-cW8j44dPhRK0XNKLzY/edit?usp=sharing" rel="nofollow noopener noreferrer"&gt;https://docs.google.com/document/d/11fzEWNcZdMXvBP4yIzxC_ENR-cW8j44dPhRK0XNKLzY/edit?usp=sharing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Loom Videos: &lt;a href="https://www.loom.com/share/2768243fd9ea47d1bd086278f7b071e9" rel="nofollow noopener noreferrer"&gt;https://www.loom.com/share/2768243fd9ea47d1bd086278f7b071e9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Project 5: Building a Live Market Intelligence Dashboard that brings it all together&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Level: Hard&lt;/li&gt;
&lt;li&gt;Tech stack: n8n and AI or LLM&lt;/li&gt;
&lt;li&gt;Description:
&lt;ul&gt;
&lt;li&gt;Google Docs: &lt;a href="https://docs.google.com/presentation/d/1eYAZR2zJOTK9uAstB5KzBLGt4u_0llFnTnfoLFC1vVE/edit?usp=sharing" rel="nofollow noopener noreferrer"&gt;https://docs.google.com/presentation/d/1eYAZR2zJOTK9uAstB5KzBLGt4u_0llFnTnfoLFC1vVE/edit?usp=sharing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Loom Video:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Summary
Built multiple AI Agents using n8n, enabling automated workflows for…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Kyl67899/Wayfair-n8n-AI-Agent-Engineering-Externship" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>automation</category>
      <category>docker</category>
      <category>n8nbrightdatachallenge</category>
    </item>
    <item>
      <title>Tidy - Cleaning Crew Co.</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Tue, 20 Oct 2026 05:17:21 +0000</pubDate>
      <link>https://dev.to/kyl67899/cleaning-company-267d</link>
      <guid>https://dev.to/kyl67899/cleaning-company-267d</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/mlh-hackathon"&gt;MLH x DEV Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built a frontend application for a cleaning company that provides cleaning services to people who would like to clean their apartment and houses. This is a schedule based service to prevent fraud and fake services apart of the Department of Labor. Users are able to submit the form for contacting the company for their services.&lt;/p&gt;

&lt;p&gt;I built a tidy - cleaning company that provides services to people that are looking for a cleaning crew to clean apartments and houses. It is a landing page with cool animation, smooth scroll, contact service &lt;/p&gt;

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

&lt;p&gt;Link to demo project: &lt;a href="https://tidy-cleaning.vercel.app/" rel="noopener noreferrer"&gt;https://tidy-cleaning.vercel.app/&lt;/a&gt;&lt;br&gt;
Demo video:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;note: not a real website for actual use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Partner Technologies
&lt;/h2&gt;

&lt;p&gt;No. I used frontend tools and technologies to complete this hackathon without any distractions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hackathon Experience
&lt;/h2&gt;

&lt;p&gt;I attended the HackGB with the University of Wisconsin but did not attend in person. I used Discord to be able to communicate with my mentor and peers to work on tidy the cleaning company project. I did not go all the way to Wisconsin to attend the in-person event because of how expensive it is to go there in the first place.&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>Secret Shortcuts on Samsung's Android Phones</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Sat, 03 Oct 2026 20:31:45 +0000</pubDate>
      <link>https://dev.to/kyl67899/shortcuts-in-on-samsungs-android-phones-300m</link>
      <guid>https://dev.to/kyl67899/shortcuts-in-on-samsungs-android-phones-300m</guid>
      <description></description>
    </item>
    <item>
      <title>Build and Deploy a Weather Application with Django, PostgreSQL, and OpenWeatherMap (Step-by-Step Guide)</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Sat, 01 Aug 2026 03:06:21 +0000</pubDate>
      <link>https://dev.to/kyl67899/build-and-deploy-a-weather-application-with-django-postgresql-and-openweathermap-step-by-step-37ph</link>
      <guid>https://dev.to/kyl67899/build-and-deploy-a-weather-application-with-django-postgresql-and-openweathermap-step-by-step-37ph</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Modern web applications often combine a powerful backend framework, a reliable relational database, and third-party APIs to provide dynamic content. In this tutorial, you'll build a &lt;strong&gt;Weather Application&lt;/strong&gt; using &lt;strong&gt;Django&lt;/strong&gt;, &lt;strong&gt;PostgreSQL&lt;/strong&gt;, and the &lt;strong&gt;OpenWeatherMap API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of simply displaying weather data, the application will also &lt;strong&gt;store each city search in a PostgreSQL database&lt;/strong&gt;, allowing you to view search history and extend the project with additional features later.&lt;/p&gt;

&lt;p&gt;By the end of this guide, you'll learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Django and PostgreSQL&lt;/li&gt;
&lt;li&gt;Configure PostgreSQL with Django&lt;/li&gt;
&lt;li&gt;Create a Django project and application&lt;/li&gt;
&lt;li&gt;Build database models&lt;/li&gt;
&lt;li&gt;Connect to the OpenWeatherMap API&lt;/li&gt;
&lt;li&gt;Display live weather information&lt;/li&gt;
&lt;li&gt;Save search history in PostgreSQL&lt;/li&gt;
&lt;li&gt;Run the project locally&lt;/li&gt;
&lt;li&gt;Prepare the project for production deployment&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  What You'll Build
&lt;/h1&gt;

&lt;p&gt;The finished application includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weather search by city&lt;/li&gt;
&lt;li&gt;Live weather information&lt;/li&gt;
&lt;li&gt;Temperature&lt;/li&gt;
&lt;li&gt;Humidity&lt;/li&gt;
&lt;li&gt;Wind speed&lt;/li&gt;
&lt;li&gt;Weather icon&lt;/li&gt;
&lt;li&gt;Search history&lt;/li&gt;
&lt;li&gt;PostgreSQL database&lt;/li&gt;
&lt;li&gt;Responsive interface&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Technology Stack
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Django&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database Tool&lt;/td&gt;
&lt;td&gt;pgAdmin 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;OpenWeatherMap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;HTML, CSS, Bootstrap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Prerequisites
&lt;/h1&gt;

&lt;p&gt;Install the following software before starting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;pgAdmin 4&lt;/li&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;li&gt;Git (optional)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; Hero banner showing Django + PostgreSQL + OpenWeatherMap architecture.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 1: Create the Project
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;weather_project
&lt;span class="nb"&gt;cd &lt;/span&gt;weather_project

python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv

&lt;span class="c"&gt;# Windows&lt;/span&gt;
venv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate

&lt;span class="c"&gt;# Linux/macOS&lt;/span&gt;
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Django and PostgreSQL support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;django psycopg2-binary requests python-dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; Terminal showing project creation and package installation.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 2: Create the Django Project
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;django-admin startproject config &lt;span class="nb"&gt;.&lt;/span&gt;
python manage.py startapp weather
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Project structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;weather_project/
│
├── config/
├── weather/
├── templates/
├── static/
├── manage.py
└── requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; VS Code Explorer with the generated project tree.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 3: Install PostgreSQL and pgAdmin
&lt;/h1&gt;

&lt;p&gt;Install PostgreSQL and launch pgAdmin.&lt;/p&gt;

&lt;p&gt;Create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database: &lt;code&gt;weatherdb&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;User: &lt;code&gt;weatheruser&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Password: &lt;code&gt;yourpassword&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; pgAdmin dashboard showing the new database.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 4: Configure Django to Use PostgreSQL
&lt;/h1&gt;

&lt;p&gt;Update &lt;code&gt;config/settings.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;DATABASES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;default&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ENGINE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;django.db.backends.postgresql&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NAME&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weatherdb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USER&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weatheruser&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PASSWORD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yourpassword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HOST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PORT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5432&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run migrations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; Successful migration output in the terminal.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 5: Create the Weather Model
&lt;/h1&gt;

&lt;p&gt;Create &lt;code&gt;weather/models.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.db&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WeatherSearch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FloatField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;humidity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IntegerField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;wind_speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FloatField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;searched_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateTimeField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto_now_add&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__str__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create migrations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py makemigrations
python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; Database table displayed in pgAdmin.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 6: Get an OpenWeatherMap API Key
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Register for a free OpenWeatherMap account.&lt;/li&gt;
&lt;li&gt;Generate an API key.&lt;/li&gt;
&lt;li&gt;Store the key in a &lt;code&gt;.env&lt;/code&gt; file.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPENWEATHER_API_KEY=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; OpenWeatherMap API dashboard with the API key section highlighted.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 7: Create the Weather View
&lt;/h1&gt;

&lt;p&gt;Implement a Django view that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accepts a city name.&lt;/li&gt;
&lt;li&gt;Calls the OpenWeatherMap API.&lt;/li&gt;
&lt;li&gt;Parses the JSON response.&lt;/li&gt;
&lt;li&gt;Saves the result in PostgreSQL.&lt;/li&gt;
&lt;li&gt;Renders the weather details.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; VS Code showing the view implementation.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 8: Build the User Interface
&lt;/h1&gt;

&lt;p&gt;Create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;templates/weather/index.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/css/style.css&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interface should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search form&lt;/li&gt;
&lt;li&gt;Weather card&lt;/li&gt;
&lt;li&gt;Weather icon&lt;/li&gt;
&lt;li&gt;Search history table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; Browser displaying the completed weather dashboard.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 9: Configure URLs
&lt;/h1&gt;

&lt;p&gt;Add application routes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;urlpatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;index&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; URL configuration highlighted in VS Code.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 10: Run the Application
&lt;/h1&gt;

&lt;p&gt;Start the development server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py runserver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Search for cities such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;London&lt;/li&gt;
&lt;li&gt;Paris&lt;/li&gt;
&lt;li&gt;Tokyo&lt;/li&gt;
&lt;li&gt;New York&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application retrieves the latest weather and stores the search in PostgreSQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; Browser showing a successful weather search.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 11: Verify Data in PostgreSQL
&lt;/h1&gt;

&lt;p&gt;Open pgAdmin.&lt;/p&gt;

&lt;p&gt;Navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;weatherdb
└── Schemas
    └── public
        └── weather_weathersearch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;weather_weathersearch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see all saved searches with timestamps and weather details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; pgAdmin query results displaying stored weather searches.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 12: Create a Search History Page
&lt;/h1&gt;

&lt;p&gt;Display previous searches in a table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;th&gt;Temperature&lt;/th&gt;
&lt;th&gt;Humidity&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This demonstrates that the application is reading data from PostgreSQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; Search history page in the browser.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 13: Project Architecture
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
    │
    ▼
Django Views
    │
    ├──────────────► OpenWeatherMap API
    │                     │
    │                     ▼
    │                JSON Response
    │
    ▼
PostgreSQL Database
    │
    ▼
Templates (HTML/CSS)
    │
    ▼
User Interface
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; Architecture diagram with icons for browser, Django, API, and PostgreSQL.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 14: Local Deployment
&lt;/h1&gt;

&lt;p&gt;Collect static files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py collectstatic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply migrations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create an administrator account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py createsuperuser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start the application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py runserver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application is now running locally with PostgreSQL as its database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image Placeholder:&lt;/strong&gt; Local deployment flow diagram.&lt;/p&gt;




&lt;h1&gt;
  
  
  Common Errors
&lt;/h1&gt;

&lt;h2&gt;
  
  
  psycopg2 Import Error
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;psycopg2-binary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Database Connection Failed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Check PostgreSQL is running.&lt;/li&gt;
&lt;li&gt;Verify credentials in &lt;code&gt;settings.py&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Confirm port &lt;code&gt;5432&lt;/code&gt; is open.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Invalid API Key
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Confirm the API key is correct.&lt;/li&gt;
&lt;li&gt;Wait a few minutes after generating a new key before first use.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Future Improvements
&lt;/h1&gt;

&lt;p&gt;You can extend this project with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Five-day weather forecast&lt;/li&gt;
&lt;li&gt;User authentication&lt;/li&gt;
&lt;li&gt;Favorite cities&lt;/li&gt;
&lt;li&gt;Interactive weather maps&lt;/li&gt;
&lt;li&gt;Charts with historical data&lt;/li&gt;
&lt;li&gt;Docker support&lt;/li&gt;
&lt;li&gt;Deployment to Render, Railway, or AWS&lt;/li&gt;
&lt;li&gt;Celery for scheduled weather updates&lt;/li&gt;
&lt;li&gt;REST API using Django REST Framework&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;You have successfully built a full-stack Weather Application using Django, PostgreSQL, pgAdmin, and the OpenWeatherMap API. The project demonstrates how to integrate a third-party API, persist data in a relational database, and build a responsive web interface using Django's Model–View–Template architecture. It provides a strong foundation for expanding into more advanced features and production deployments.&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Build and Deploy a Weather Flask Application Using OpenWeatherMap (Step-by-Step Guide)</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Sat, 01 Aug 2026 02:58:57 +0000</pubDate>
      <link>https://dev.to/kyl67899/build-and-deploy-a-weather-flask-application-using-openweathermap-step-by-step-guide-2de6</link>
      <guid>https://dev.to/kyl67899/build-and-deploy-a-weather-flask-application-using-openweathermap-step-by-step-guide-2de6</guid>
      <description>&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Want to learn Flask by building a real-world project? In this tutorial, you'll create a weather web application using Python Flask and the OpenWeatherMap API. The application allows user to search for any city and instantly view its current weather conditions. &lt;/p&gt;

&lt;p&gt;By the end of this guide, you'll know how to:&lt;br&gt;
Install Flask &lt;br&gt;
Create a Flask project&lt;br&gt;
Get a OpenWeatherMap API key&lt;br&gt;
Connect the API to your application&lt;br&gt;
Design a simple weather dashboard&lt;br&gt;
Run the application on your local machine or use docker or a database.&lt;/p&gt;

&lt;p&gt;Project Overview&lt;br&gt;
The application includes:&lt;br&gt;
City Search &lt;br&gt;
Current temperature&lt;br&gt;
Humidity&lt;br&gt;
Wind Speed&lt;br&gt;
Weather Icon&lt;br&gt;
Responsive User Interface&lt;/p&gt;

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

&lt;p&gt;Project Overview&lt;/p&gt;

&lt;p&gt;The application includes:&lt;br&gt;
Prerequisites&lt;br&gt;
Before starting, install:&lt;/p&gt;

&lt;p&gt;Python 3.14 or later&lt;br&gt;
pip &lt;br&gt;
Visual Studio Code (recommended)&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Create the Project Folder
&lt;/h2&gt;

&lt;p&gt;Open Terminal or Command Prompt.&lt;br&gt;
mkdir weather-flask-app&lt;br&gt;
cd weather-flask-app&lt;/p&gt;

&lt;p&gt;Image 1: Terminal showing the project folder creation.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Create a Virtual Environment
&lt;/h2&gt;

&lt;p&gt;Windows&lt;br&gt;
python -m venv venv&lt;br&gt;
venv\Scripts\activate&lt;/p&gt;

&lt;p&gt;Linux/MacOS&lt;br&gt;
source venv/bin/activate&lt;/p&gt;

&lt;p&gt;You should now see:&lt;br&gt;
(venv)&lt;/p&gt;

&lt;p&gt;Before your terminal prompt.&lt;/p&gt;

&lt;p&gt;Image 2: Activate virtual environment in the terminal&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Install Required Packages
&lt;/h2&gt;

&lt;p&gt;Install Flask and Requests.&lt;/p&gt;

&lt;p&gt;pip install flask requests&lt;/p&gt;

&lt;p&gt;Verify Installations:&lt;/p&gt;

&lt;p&gt;pip list&lt;/p&gt;

&lt;p&gt;📷 Image 3: Installed Flask packages.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4: Create the Project Structure
&lt;/h2&gt;

&lt;p&gt;Create the following folders and files.&lt;/p&gt;

&lt;p&gt;weather-flask-app/&lt;br&gt;
│&lt;br&gt;
├── app.py&lt;br&gt;
├── templates/&lt;br&gt;
│   └── index.html&lt;br&gt;
├── static/&lt;br&gt;
│   └── style.css&lt;br&gt;
└── venv/&lt;/p&gt;

&lt;p&gt;📷 Image 4: Project structure in VS Code Explorer.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 5: Create an OpenWeatherMap API Key
&lt;/h2&gt;

&lt;p&gt;Visit the OpenWeatherMap website.&lt;br&gt;
Create a free account.&lt;br&gt;
Log in.&lt;br&gt;
Navigate to API Keys.&lt;br&gt;
Copy your generated API key.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;API_KEY = your_api_key_here&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;📷 Image 5: OpenWeatherMap dashboard displaying the API key page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Create the Flask Backend
&lt;/h2&gt;

&lt;p&gt;Create app.py.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from flask import Flask, render_template, request
import requests

app = Flask(__name__)

API_KEY = "YOUR_API_KEY"

@app.route("/", methods=["GET", "POST"])
def index():
    weather = None

    if request.method == "POST":
        city = request.form["city"]

        url = f"https://api.openweathermap.org/data/2.5/weather?q={city}&amp;amp;appid={API_KEY}&amp;amp;units=metric"

        response = requests.get(url).json()

        if response.get("cod") == 200:
            weather = {
                "city": response["name"],
                "temperature": response["main"]["temp"],
                "description": response["weather"][0]["description"],
                "humidity": response["main"]["humidity"],
                "wind": response["wind"]["speed"],
                "icon": response["weather"][0]["icon"]
            }

    return render_template("index.html", weather=weather)

if __name__ == "__main__":
    app.run(debug=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;p&gt;📷 Image 6: app.py open in VS Code.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 7: Create the HTML Template
&lt;/h2&gt;

&lt;p&gt;Create templates/index.html.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Weather App&amp;lt;/title&amp;gt;
    &amp;lt;link rel="stylesheet" href="/static/style.css"&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;

&amp;lt;div class="container"&amp;gt;

&amp;lt;h1&amp;gt;Weather Application&amp;lt;/h1&amp;gt;

&amp;lt;form method="POST"&amp;gt;
&amp;lt;input type="text" name="city" placeholder="Enter city name"&amp;gt;
&amp;lt;button type="submit"&amp;gt;Search&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;

{% if weather %}

&amp;lt;h2&amp;gt;{{ weather.city }}&amp;lt;/h2&amp;gt;

&amp;lt;img src="https://openweathermap.org/img/wn/{{ weather.icon }}@2x.png"&amp;gt;

&amp;lt;p&amp;gt;Temperature: {{ weather.temperature }} °C&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Weather: {{ weather.description }}&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Humidity: {{ weather.humidity }}%&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Wind Speed: {{ weather.wind }} m/s&amp;lt;/p&amp;gt;

{% endif %}

&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

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

&lt;/div&gt;

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

&lt;p&gt;📷 Image 7: HTML page inside VS Code.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 8: Add CSS Styling
&lt;/h2&gt;

&lt;p&gt;Create static/style.css.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body{
font-family:Arial;
background:#4facfe;
background:linear-gradient(to right,#00f2fe,#4facfe);
display:flex;
justify-content:center;
align-items:center;
height:100vh;
}

.container{
background:white;
padding:30px;
border-radius:15px;
text-align:center;
box-shadow:0 5px 15px rgba(0,0,0,.2);
}

input{
padding:10px;
width:220px;
}

button{
padding:10px 20px;
background:#2196F3;
color:white;
border:none;
cursor:pointer;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📷 Image 8: Styled weather application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9: Run the Flask Application
&lt;/h2&gt;

&lt;p&gt;Run:&lt;/p&gt;

&lt;p&gt;python app.py&lt;/p&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running on &lt;a href="http://127.0.0.1:5000" rel="noopener noreferrer"&gt;http://127.0.0.1:5000&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open your browser and visit:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://127.0.0.1:5000" rel="noopener noreferrer"&gt;http://127.0.0.1:5000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📷 Image 9: Terminal showing the Flask development server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 10: Test the Application
&lt;/h2&gt;

&lt;p&gt;Search for cities such as:&lt;/p&gt;

&lt;p&gt;London&lt;br&gt;
New York&lt;br&gt;
Tokyo&lt;br&gt;
Paris&lt;br&gt;
Delhi&lt;/p&gt;

&lt;p&gt;The application displays:&lt;/p&gt;

&lt;p&gt;City name&lt;br&gt;
Current temperature&lt;br&gt;
Weather condition&lt;br&gt;
Humidity&lt;br&gt;
Wind speed&lt;br&gt;
Weather icon&lt;/p&gt;

&lt;p&gt;📷 Image 10: Weather results displayed after searching for a city.&lt;/p&gt;

&lt;p&gt;How the Application Works&lt;br&gt;
User enters a city name.&lt;br&gt;
Flask receives the request.&lt;br&gt;
Requests sends an HTTP request to the OpenWeatherMap API.&lt;br&gt;
The API returns weather data in JSON format.&lt;br&gt;
Flask extracts the required fields.&lt;br&gt;
The template displays the weather information.&lt;br&gt;
Common Errors&lt;br&gt;
Invalid API Key&lt;/p&gt;

&lt;p&gt;Error:&lt;/p&gt;

&lt;p&gt;401 Unauthorized&lt;/p&gt;

&lt;p&gt;Solution:&lt;/p&gt;

&lt;p&gt;Use the correct API key and wait a few minutes after generating it if it is newly created.&lt;/p&gt;

&lt;p&gt;City Not Found&lt;/p&gt;

&lt;p&gt;Error:&lt;/p&gt;

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

&lt;p&gt;Solution:&lt;/p&gt;

&lt;p&gt;Check the spelling of the city name.&lt;/p&gt;

&lt;p&gt;Module Not Found&lt;/p&gt;

&lt;p&gt;Error:&lt;/p&gt;

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

&lt;p&gt;Solution:&lt;/p&gt;

&lt;p&gt;Install the missing package:&lt;/p&gt;

&lt;p&gt;pip install flask requests&lt;br&gt;
Future Improvements&lt;/p&gt;

&lt;p&gt;You can extend the application by adding:&lt;/p&gt;

&lt;p&gt;5-day weather forecast&lt;br&gt;
Air quality information&lt;br&gt;
Geolocation support&lt;br&gt;
Dark mode&lt;br&gt;
Weather maps&lt;br&gt;
Search history&lt;br&gt;
Favorite cities&lt;br&gt;
Temperature unit conversion (°C/°F)&lt;br&gt;
Conclusion&lt;/p&gt;

&lt;p&gt;Congratulations! You have built a complete Weather Flask application using Python and the OpenWeatherMap API. Along the way, you learned how to create a Flask project, integrate a third-party REST API, build a responsive web interface, and run the application locally. This project is an excellent starting point for learning web development with Flask and can be enhanced with additional features such as weather forecasts, user authentication, and cloud deployment.&lt;/p&gt;

</description>
      <category>api</category>
      <category>python</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Updates in Next.js 16.3: AI-Native Development, Better Security, and Instant Navigation</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Sat, 01 Aug 2026 01:57:30 +0000</pubDate>
      <link>https://dev.to/kyl67899/whats-new-in-nextjs-163-ai-native-development-better-security-and-instant-navigation-2fm0</link>
      <guid>https://dev.to/kyl67899/whats-new-in-nextjs-163-ai-native-development-better-security-and-instant-navigation-2fm0</guid>
      <description>&lt;p&gt;The Next.js team continues to push the boundaries of modern web development with the &lt;strong&gt;Next.js 16.3 Preview&lt;/strong&gt;. While previous releases focused on performance and caching, version 16.3 shifts its attention toward &lt;strong&gt;AI-native development&lt;/strong&gt;, &lt;strong&gt;developer security&lt;/strong&gt;, and &lt;strong&gt;instant application navigation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As AI coding assistants become a core part of the development workflow, Next.js is evolving into a framework that not only builds applications but also helps AI agents understand, debug, and improve them safely.&lt;/p&gt;

&lt;p&gt;Let's explore the biggest improvements in Next.js 16.3.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. AI-Native Development Experience
&lt;/h2&gt;

&lt;p&gt;One of the most exciting additions in Next.js 16.3 is its first-class support for AI coding assistants.&lt;/p&gt;

&lt;p&gt;Instead of treating AI as an external tool, Next.js now includes built-in capabilities that help agents understand your project structure, documentation, and runtime behavior.&lt;/p&gt;

&lt;p&gt;Key improvements include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version-aware documentation&lt;/strong&gt; through &lt;strong&gt;AGENTS.md&lt;/strong&gt;, ensuring AI assistants reference the correct framework version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First-party Skills&lt;/strong&gt; that guide AI through multi-step development workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Browser&lt;/strong&gt; with React introspection, allowing compatible AI tools to inspect component state and application behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actionable errors&lt;/strong&gt; with copy-ready prompts that make troubleshooting faster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These enhancements reduce hallucinations from AI assistants and provide more accurate, context-aware code suggestions.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Safer AI Tooling
&lt;/h2&gt;

&lt;p&gt;As developers increasingly rely on AI to generate and modify code, security has become a critical concern.&lt;/p&gt;

&lt;p&gt;Added 'skills' that would be useful for multi-step workflow. Visit &lt;a href="https://www.skills.sh/" rel="noopener noreferrer"&gt;skills.sh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Skill requires agent-browser version 0.27 or later.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx skills add vercel/next.js --skill next-dev-loop&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Next.js 16.3 introduces several improvements that make AI interactions safer and more reliable:&lt;/p&gt;

&lt;h3&gt;
  
  
  Smaller MCP Server
&lt;/h3&gt;

&lt;p&gt;The built-in Model Context Protocol (MCP) server now exposes only the tools required for build diagnostics while separating larger knowledge-base functionality.&lt;/p&gt;

&lt;p&gt;Benefits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduced attack surface&lt;/li&gt;
&lt;li&gt;Better isolation of tooling&lt;/li&gt;
&lt;li&gt;More predictable AI interactions&lt;/li&gt;
&lt;li&gt;Improved maintainability&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Better Diagnostic Tools
&lt;/h3&gt;

&lt;p&gt;Instead of allowing AI to freely inspect an application, Next.js now provides structured diagnostic capabilities that expose only the information necessary for debugging.&lt;/p&gt;

&lt;p&gt;This improves both developer productivity and security by limiting unnecessary access to project internals.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Instant Navigations
&lt;/h2&gt;

&lt;p&gt;Perhaps the most noticeable user-facing feature is &lt;strong&gt;Instant Navigations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of waiting for an entire page to load, Next.js intelligently streams or caches route content to make navigation feel nearly instantaneous.&lt;/p&gt;

&lt;p&gt;Highlights include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant route transitions&lt;/li&gt;
&lt;li&gt;Streaming page updates&lt;/li&gt;
&lt;li&gt;Intelligent route caching&lt;/li&gt;
&lt;li&gt;Configurable navigation strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Applications now feel much closer to native desktop or mobile experiences.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Partial Prefetching
&lt;/h2&gt;

&lt;p&gt;Building on previous routing improvements, Next.js 16.3 introduces &lt;strong&gt;Partial Prefetching&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Rather than downloading an entire route ahead of time, the framework caches reusable layout shells and streams only the dynamic content when users navigate.&lt;/p&gt;

&lt;p&gt;Benefits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lower bandwidth usage&lt;/li&gt;
&lt;li&gt;Faster perceived performance&lt;/li&gt;
&lt;li&gt;Reduced redundant downloads&lt;/li&gt;
&lt;li&gt;Improved scalability for large applications&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Improved AI Debugging Workflow
&lt;/h2&gt;

&lt;p&gt;Debugging AI-generated code is often harder than writing it.&lt;/p&gt;

&lt;p&gt;Next.js 16.3 addresses this by introducing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More descriptive compiler diagnostics&lt;/li&gt;
&lt;li&gt;Actionable error messages&lt;/li&gt;
&lt;li&gt;Copy-ready prompts for AI assistants&lt;/li&gt;
&lt;li&gt;Better build insights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These improvements help developers quickly identify problems and collaborate more effectively with AI coding tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Documentation Designed for AI
&lt;/h2&gt;

&lt;p&gt;Documentation has traditionally been written for humans.&lt;/p&gt;

&lt;p&gt;With Next.js 16.3, documentation is also optimized for AI systems.&lt;/p&gt;

&lt;p&gt;New capabilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Markdown versions of documentation pages&lt;/li&gt;
&lt;li&gt;Easier machine-readable content&lt;/li&gt;
&lt;li&gt;Version-specific references&lt;/li&gt;
&lt;li&gt;Better retrieval for coding assistants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This helps reduce outdated or incorrect suggestions from AI tools by ensuring they consume the most relevant documentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Faster Development Builds
&lt;/h2&gt;

&lt;p&gt;Although AI is the headline feature, developers also benefit from continued performance improvements.&lt;/p&gt;

&lt;p&gt;Next.js 16.3 includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Persistent Turbopack caching&lt;/li&gt;
&lt;li&gt;Faster incremental builds&lt;/li&gt;
&lt;li&gt;Reduced compilation times&lt;/li&gt;
&lt;li&gt;Better memory management during development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Large projects see noticeable improvements in rebuild speed and overall responsiveness.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Next.js 16.3 Matters
&lt;/h2&gt;

&lt;p&gt;The 16.3 Preview represents a shift in how frameworks are built.&lt;/p&gt;

&lt;p&gt;Rather than simply optimizing rendering performance, Next.js now embraces a future where AI coding assistants are part of every developer's toolkit. By combining AI-aware documentation, structured diagnostics, secure tooling, and faster navigation, the framework helps teams build applications more efficiently without sacrificing reliability or security.&lt;/p&gt;




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

&lt;p&gt;Next.js 16.3 is more than an incremental update. It introduces a new direction for modern web development—one where AI assistants, developers, and the framework work together seamlessly.&lt;/p&gt;

&lt;p&gt;The standout additions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI-native development tools&lt;/li&gt;
&lt;li&gt;Improved security through a more focused MCP server&lt;/li&gt;
&lt;li&gt;Version-aware documentation for AI agents&lt;/li&gt;
&lt;li&gt;Instant Navigations&lt;/li&gt;
&lt;li&gt;Partial Prefetching&lt;/li&gt;
&lt;li&gt;Better diagnostics and debugging&lt;/li&gt;
&lt;li&gt;Faster Turbopack builds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While still in Preview, these features provide a glimpse into the future of full-stack React development and position Next.js as one of the most forward-looking frameworks in the ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Official Next.js 16.3 AI Improvements announcement: &lt;a href="https://nextjs.org/blog/next-16-3-ai-improvements" rel="noopener noreferrer"&gt;https://nextjs.org/blog/next-16-3-ai-improvements&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Official Next.js 16.3 Instant Navigations announcement: &lt;a href="https://nextjs.org/blog/next-16-3-instant-navigations" rel="noopener noreferrer"&gt;https://nextjs.org/blog/next-16-3-instant-navigations&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Next.js Blog: &lt;a href="https://nextjs.org/blog" rel="noopener noreferrer"&gt;https://nextjs.org/blog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Next.js Documentation: &lt;a href="https://nextjs.org/docs" rel="noopener noreferrer"&gt;https://nextjs.org/docs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/blog" rel="noopener noreferrer"&gt;https://nextjs.org/blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nextjs</category>
      <category>frontend</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>End-to-End (E2E) testing pipeline</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Sat, 23 May 2026 21:02:29 +0000</pubDate>
      <link>https://dev.to/kyl67899/end-to-end-e2e-testing-pipeline-dl8</link>
      <guid>https://dev.to/kyl67899/end-to-end-e2e-testing-pipeline-dl8</guid>
      <description>&lt;p&gt;Let’s build a &lt;strong&gt;real End-to-End (E2E) testing pipeline&lt;/strong&gt; like teams use in production using &lt;strong&gt;Playwright (recommended)&lt;/strong&gt; and GitHub Actions.&lt;/p&gt;

&lt;p&gt;I’ll show you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧪 What E2E testing is&lt;/li&gt;
&lt;li&gt;⚙️ Playwright setup (React app example)&lt;/li&gt;
&lt;li&gt;🚀 GitHub Actions CI pipeline&lt;/li&gt;
&lt;li&gt;📸 Test reports + screenshots on failure&lt;/li&gt;
&lt;li&gt;🧠 Production best practices&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🧠 0. What is E2E testing?
&lt;/h1&gt;

&lt;p&gt;E2E (End-to-End) testing means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Test your app like a real user would use it.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of testing functions, you test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clicking buttons&lt;/li&gt;
&lt;li&gt;Filling forms&lt;/li&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;li&gt;API + UI together&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  ⚔️ Playwright vs Cypress (quick decision)
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Playwright&lt;/th&gt;
&lt;th&gt;Cypress&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;🚀 Faster&lt;/td&gt;
&lt;td&gt;متوسط&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-browser&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI friendly&lt;/td&gt;
&lt;td&gt;⭐ Excellent&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modern apps&lt;/td&gt;
&lt;td&gt;⭐ Best choice&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 We’ll use &lt;strong&gt;Playwright (industry standard in 2025)&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  🧱 1. Install Playwright (React project)
&lt;/h1&gt;



&lt;p&gt;```bash id="pw1"&lt;br&gt;
npm init playwright@latest&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


When prompted choose:

* JavaScript or TypeScript (TS recommended)
* Tests folder: `tests`
* GitHub Actions: YES

---

# 📁 2. Project structure



```plaintext id="pw2"
my-app/
 ├── tests/
 │    ├── example.spec.ts
 ├── playwright.config.ts
 ├── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🧪 3. First E2E test (real user flow)
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Example: Login flow test
&lt;/h2&gt;



&lt;p&gt;```ts id="test1"&lt;br&gt;
import { test, expect } from '@playwright/test';&lt;/p&gt;

&lt;p&gt;test('user can login successfully', async ({ page }) =&amp;gt; {&lt;br&gt;
  await page.goto('&lt;a href="http://localhost:3000/login'" rel="noopener noreferrer"&gt;http://localhost:3000/login'&lt;/a&gt;);&lt;/p&gt;

&lt;p&gt;await page.fill('input[name="email"]', '&lt;a href="mailto:test@example.com"&gt;test@example.com&lt;/a&gt;');&lt;br&gt;
  await page.fill('input[name="password"]', 'password123');&lt;/p&gt;

&lt;p&gt;await page.click('button[type="submit"]');&lt;/p&gt;

&lt;p&gt;await expect(page).toHaveURL(/dashboard/);&lt;br&gt;
});&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# 🚀 4. Run tests locally



```bash id="run1"
npx playwright test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open UI mode (very useful):&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```bash id="ui1"&lt;br&gt;
npx playwright test --ui&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# 📸 5. Auto screenshots on failure

Playwright automatically captures:

* screenshots
* videos
* traces

Enable in config:



```ts id="cfg1"
use: {
  screenshot: 'only-on-failure',
  video: 'retain-on-failure',
  trace: 'on-first-retry'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  ⚙️ 6. GitHub Actions CI pipeline (E2E automation)
&lt;/h1&gt;
&lt;h2&gt;
  
  
  📁 &lt;code&gt;.github/workflows/e2e.yml&lt;/code&gt;
&lt;/h2&gt;



&lt;p&gt;```yaml id="ci1"&lt;br&gt;
name: E2E Tests (Playwright)&lt;/p&gt;

&lt;p&gt;on:&lt;br&gt;
  push:&lt;br&gt;
    branches: [ main ]&lt;br&gt;
  pull_request:&lt;br&gt;
    branches: [ main ]&lt;/p&gt;

&lt;p&gt;jobs:&lt;br&gt;
  test:&lt;br&gt;
    runs-on: ubuntu-latest&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;steps:
  - uses: actions/checkout@v4

  - name: Setup Node
    uses: actions/setup-node@v4
    with:
      node-version: 20

  - name: Install dependencies
    run: npm install

  - name: Install Playwright browsers
    run: npx playwright install --with-deps

  - name: Run Playwright tests
    run: npx playwright test
&lt;/code&gt;&lt;/pre&gt;

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


---

# 🧠 7. What happens in CI



```plaintext id="flow1"
Push code
   ↓
GitHub Actions starts
   ↓
Install dependencies
   ↓
Install browsers (Chromium, Firefox, WebKit)
   ↓
Run E2E tests
   ↓
Pass → allow merge
Fail → block PR + show report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  📊 8. Add HTML test report
&lt;/h1&gt;

&lt;p&gt;Enable report:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```ts id="rep1"&lt;br&gt;
reporter: [['html'], ['list']]&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Then in CI:



```yaml id="rep2"
- name: Upload Playwright report
  uses: actions/upload-artifact@v4
  if: always()
  with:
    name: playwright-report
    path: playwright-report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🌐 9. Test real deployed app (PRO setup)
&lt;/h1&gt;

&lt;p&gt;Instead of localhost:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```ts id="prod1"&lt;br&gt;
await page.goto('&lt;a href="https://your-app.vercel.app/login'" rel="noopener noreferrer"&gt;https://your-app.vercel.app/login'&lt;/a&gt;);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


👉 This turns it into **true production E2E testing**

---

# 🧪 10. Advanced real-world test examples

---

## 🟢 UI navigation test



```ts id="nav1"
test('navigate to dashboard', async ({ page }) =&amp;gt; {
  await page.goto('/');
  await page.click('text=Dashboard');
  await expect(page).toHaveURL(/dashboard/);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🟡 Form validation test
&lt;/h2&gt;



&lt;p&gt;```ts id="form1"&lt;br&gt;
test('shows error for empty email', async ({ page }) =&amp;gt; {&lt;br&gt;
  await page.goto('/login');&lt;br&gt;
  await page.click('button[type="submit"]');&lt;/p&gt;

&lt;p&gt;await expect(page.locator('.error')).toContainText('Email is required');&lt;br&gt;
});&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🔵 API + UI combined test



```ts id="api1"
test('data loads after API call', async ({ page }) =&amp;gt; {
  await page.goto('/dashboard');

  await expect(page.locator('.loading')).toBeHidden();
  await expect(page.locator('.chart')).toBeVisible();
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🔐 11. CI best practices (IMPORTANT)
&lt;/h1&gt;
&lt;h3&gt;
  
  
  ✔ Run E2E after build
&lt;/h3&gt;



&lt;p&gt;```yaml id="bp1"&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run: npm run build&lt;/li&gt;
&lt;li&gt;run: npm start &amp;amp;
```
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ✔ Use staging environment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;staging.example.com&lt;/li&gt;
&lt;li&gt;production.example.com&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ✔ Retry flaky tests
&lt;/h3&gt;



&lt;p&gt;```ts id="rt1"&lt;br&gt;
retries: 2&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# ⚠️ 12. Common mistakes

### ❌ Testing implementation instead of behavior

Bad:



```ts id="bad1"
expect(component.state).toBe(true)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;p&gt;```ts id="good1"&lt;br&gt;
expect(page).toHaveText('Welcome')&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

### ❌ No stable selectors

Use:



```html id="sel1"
data-testid="login-button"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;p&gt;```ts id="sel2"&lt;br&gt;
page.getByTestId('login-button')&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

### ❌ Running E2E without CI

Always run in GitHub Actions

---

# 🧠 Final architecture



```plaintext id="final1"
Push / PR
   ↓
CI (unit tests)
   ↓
E2E tests (Playwright)
   ↓
Build app
   ↓
Deploy to staging/production
   ↓
Report + screenshots stored in GitHub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🚀 What you just built
&lt;/h1&gt;

&lt;p&gt;You now have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧪 Real user simulation testing&lt;/li&gt;
&lt;li&gt;🚀 CI/CD integrated E2E pipeline&lt;/li&gt;
&lt;li&gt;📸 Failure screenshots + videos&lt;/li&gt;
&lt;li&gt;🌍 Production-ready test system&lt;/li&gt;
&lt;li&gt;🔒 Safe deployment gating system&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>playwright</category>
    </item>
    <item>
      <title>Auto versioning + changelog generation using Github Action</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Sat, 23 May 2026 21:01:19 +0000</pubDate>
      <link>https://dev.to/kyl67899/auto-versioning-changelog-generation-using-github-action-13hd</link>
      <guid>https://dev.to/kyl67899/auto-versioning-changelog-generation-using-github-action-13hd</guid>
      <description>&lt;p&gt;Auto versioning + changelog generation is a &lt;strong&gt;very real production pattern&lt;/strong&gt; used in open-source and SaaS teams to avoid messy release notes and manual tagging.&lt;/p&gt;

&lt;p&gt;We’ll build a clean system using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 Conventional commits (rules for commit messages)&lt;/li&gt;
&lt;li&gt;🤖 Semantic versioning automation&lt;/li&gt;
&lt;li&gt;📜 Auto-generated CHANGELOG&lt;/li&gt;
&lt;li&gt;🚀 GitHub Actions workflow&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🧠 0. What we’re building
&lt;/h1&gt;



&lt;p&gt;```plaintext id="flow0"&lt;br&gt;
commit → push → GitHub Action&lt;br&gt;
        ↓&lt;br&gt;
analyze commits&lt;br&gt;
        ↓&lt;br&gt;
bump version (patch/minor/major)&lt;br&gt;
        ↓&lt;br&gt;
generate changelog&lt;br&gt;
        ↓&lt;br&gt;
create git tag&lt;br&gt;
        ↓&lt;br&gt;
create GitHub release&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# 📦 1. Install required tool (standard approach)

We’ll use:

👉 **semantic-release** (industry standard)



```bash id="inst1"
npm install --save-dev semantic-release @semantic-release/changelog @semantic-release/git @semantic-release/github
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🧠 2. Use Conventional Commits (VERY important)
&lt;/h1&gt;

&lt;p&gt;Your commits MUST follow this format:&lt;/p&gt;
&lt;h2&gt;
  
  
  ✅ Examples
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Feature (minor version bump)
&lt;/h3&gt;



&lt;p&gt;```bash id="c1"&lt;br&gt;
feat: add user login system&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


### Fix (patch version bump)



```bash id="c2"
fix: resolve navbar bug on mobile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Breaking change (major version bump)
&lt;/h3&gt;



&lt;p&gt;```bash id="c3"&lt;br&gt;
feat!: redesign API structure&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


or



```bash id="c4"
BREAKING CHANGE: remove old auth system
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  ⚙️ 3. Create semantic-release config
&lt;/h1&gt;
&lt;h2&gt;
  
  
  📁 &lt;code&gt;.releaserc.json&lt;/code&gt;
&lt;/h2&gt;



&lt;p&gt;```json id="r1"&lt;br&gt;
{&lt;br&gt;
  "branches": ["main"],&lt;br&gt;
  "plugins": [&lt;br&gt;
    "@semantic-release/commit-analyzer",&lt;br&gt;
    "@semantic-release/release-notes-generator",&lt;br&gt;
    "@semantic-release/changelog",&lt;br&gt;
    "@semantic-release/github",&lt;br&gt;
    [&lt;br&gt;
      "@semantic-release/git",&lt;br&gt;
      {&lt;br&gt;
        "assets": ["package.json", "CHANGELOG.md"],&lt;br&gt;
        "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"&lt;br&gt;
      }&lt;br&gt;
    ]&lt;br&gt;
  ]&lt;br&gt;
}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# 📜 4. Create CHANGELOG file



```bash id="ch1"
touch CHANGELOG.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Start empty:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```md id="ch2"&lt;/p&gt;

&lt;h1&gt;
  
  
  Changelog
&lt;/h1&gt;

&lt;p&gt;All notable changes will be documented here.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# 🚀 5. GitHub Actions workflow (AUTO VERSION + CHANGELOG)

## 📁 `.github/workflows/release.yml`



```yaml id="w1"
name: Auto Version &amp;amp; Changelog

on:
  push:
    branches:
      - main

jobs:
  release:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Install dependencies
        run: npm install

      - name: Run semantic release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: npx semantic-release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🧠 6. What this does automatically
&lt;/h1&gt;

&lt;p&gt;When you push to &lt;code&gt;main&lt;/code&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  It will:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Analyze commits&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Decide version bump:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fix → 1.0.1&lt;/li&gt;
&lt;li&gt;feat → 1.1.0&lt;/li&gt;
&lt;li&gt;breaking → 2.0.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generate changelog&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create Git tag&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create GitHub Release&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update &lt;code&gt;CHANGELOG.md&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  📜 7. Example auto-generated changelog
&lt;/h1&gt;



&lt;p&gt;```md id="log1"&lt;/p&gt;

&lt;h1&gt;
  
  
  1.2.0 (2026-05-23)
&lt;/h1&gt;

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

&lt;ul&gt;
&lt;li&gt;add user authentication system&lt;/li&gt;
&lt;li&gt;add dashboard analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;fix navbar alignment on mobile&lt;/li&gt;
&lt;li&gt;fix API timeout issue
```
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🏷️ 8. Example GitHub releases
&lt;/h1&gt;

&lt;p&gt;GitHub will automatically create:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```plaintext id="rel1"&lt;br&gt;
v1.2.0 - Production Release&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user auth system&lt;/li&gt;
&lt;li&gt;analytics dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mobile navbar bug
```
&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  🔐 9. GitHub Secrets needed
&lt;/h1&gt;

&lt;p&gt;Make sure this exists:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```plaintext id="sec1"&lt;br&gt;
GITHUB_TOKEN (auto provided by GitHub Actions)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


No extra setup required.

---

# 🧪 10. Real workflow in action

### Developer flow:



```plaintext id="flow1"
git commit -m "feat: add dashboard UI"
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GitHub automatically:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Detects commit type (&lt;code&gt;feat&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Bumps version → minor update&lt;/li&gt;
&lt;li&gt;Updates CHANGELOG.md&lt;/li&gt;
&lt;li&gt;Creates git tag (v1.3.0)&lt;/li&gt;
&lt;li&gt;Publishes GitHub release&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  🔥 11. Pro upgrades (used in companies)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🟢 Auto publish npm package
&lt;/h2&gt;



&lt;p&gt;```yaml id="npm1"&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run: npm publish
```
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🟡 Slack release notification
&lt;/h2&gt;



&lt;p&gt;```yaml id="slack1"&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name: Notify Slack
run: curl -X POST $SLACK_WEBHOOK
```
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔵 Multi-branch releases
&lt;/h2&gt;



&lt;p&gt;```json id="branch1"&lt;br&gt;
"branches": ["main", "next"]&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🟣 Changelog formatting customization

You can group commits like:

* Features
* Fixes
* Performance
* Breaking changes

---

# ⚠️ 12. Common mistakes

### ❌ Not using conventional commits

→ versioning won’t work properly

### ❌ Pushing messy commit messages



```bash id="bad1"
fix stuff
update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ❌ Forgetting fetch-depth: 0
&lt;/h3&gt;

&lt;p&gt;→ release history breaks&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 Final architecture
&lt;/h1&gt;



&lt;p&gt;```plaintext id="final1"&lt;br&gt;
Commit (feat/fix/breaking)&lt;br&gt;
        ↓&lt;br&gt;
GitHub Action triggers&lt;br&gt;
        ↓&lt;br&gt;
semantic-release analyzes commits&lt;br&gt;
        ↓&lt;br&gt;
bumps version automatically&lt;br&gt;
        ↓&lt;br&gt;
updates CHANGELOG.md&lt;br&gt;
        ↓&lt;br&gt;
creates git tag + GitHub release&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# 🚀 What you just built (REAL DEVOPS LEVEL)

You now have:

* 🤖 Automated versioning
* 📜 Auto changelog generation
* 🏷️ Git tags + GitHub releases
* 🚀 CI/CD-ready release pipeline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>cicd</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Auto PR + Auto Deploy workflow using CI/CD Pipline</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Sat, 23 May 2026 21:00:37 +0000</pubDate>
      <link>https://dev.to/kyl67899/auto-pr-auto-deploy-workflow-using-cicd-pipline-4eoh</link>
      <guid>https://dev.to/kyl67899/auto-pr-auto-deploy-workflow-using-cicd-pipline-4eoh</guid>
      <description>&lt;p&gt;Here’s a &lt;strong&gt;real production-style Auto PR + Auto Deploy workflow&lt;/strong&gt; using GitHub Actions. This is the kind of setup used in teams to keep &lt;code&gt;main&lt;/code&gt; stable and deployments automatic.&lt;/p&gt;

&lt;p&gt;We’ll build it in &lt;strong&gt;3 parts&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🤖 Auto-create Pull Requests (from feature → main)&lt;/li&gt;
&lt;li&gt;🧪 Run CI checks on PRs&lt;/li&gt;
&lt;li&gt;🚀 Auto-deploy when merged to main&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  🧠 0. What we are building
&lt;/h1&gt;



&lt;p&gt;```plaintext id="flow1"&lt;br&gt;
feature branch push&lt;br&gt;
   ↓&lt;br&gt;
Auto PR created (GitHub Action)&lt;br&gt;
   ↓&lt;br&gt;
CI runs (tests, lint)&lt;br&gt;
   ↓&lt;br&gt;
PR merged to main&lt;br&gt;
   ↓&lt;br&gt;
Auto deploy to production&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# 🤖 1. Auto Create Pull Request Workflow

This automatically creates a PR when you push a feature branch.

## 📁 `.github/workflows/auto-pr.yml`



```yaml id="pr1"
name: Auto Create Pull Request

on:
  push:
    branches-ignore:
      - main

jobs:
  create-pr:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Create Pull Request
        uses: repo-sync/pull-request@v2
        with:
          destination_branch: main
          github_token: ${{ secrets.GITHUB_TOKEN }}
          pr_title: "Auto PR: ${{ github.ref_name }}"
          pr_body: |
            ## 🤖 Auto-generated PR

            Branch: `${{ github.ref_name }}`
            Please review changes before merging.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧠 What this does:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Push to &lt;code&gt;feature/login&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Actions triggers&lt;/li&gt;
&lt;li&gt;Automatically opens PR → &lt;code&gt;feature/login → main&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  🧪 2. CI Pipeline (runs on PRs)
&lt;/h1&gt;

&lt;p&gt;This ensures only clean code gets merged.&lt;/p&gt;
&lt;h2&gt;
  
  
  📁 &lt;code&gt;.github/workflows/ci.yml&lt;/code&gt;
&lt;/h2&gt;



&lt;p&gt;```yaml id="ci1"&lt;br&gt;
name: CI Checks&lt;/p&gt;

&lt;p&gt;on:&lt;br&gt;
  pull_request:&lt;br&gt;
    branches: [ main ]&lt;/p&gt;

&lt;p&gt;jobs:&lt;br&gt;
  test:&lt;br&gt;
    runs-on: ubuntu-latest&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;steps:
  - uses: actions/checkout@v4

  - name: Setup Node
    uses: actions/setup-node@v4
    with:
      node-version: 20

  - name: Install dependencies
    run: npm install

  - name: Run lint
    run: npm run lint

  - name: Run tests
    run: npm test
&lt;/code&gt;&lt;/pre&gt;

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


---

## 🧠 What this does:

Before merge:

* Runs lint checks
* Runs tests
* Blocks bad code from merging

---

# 🚀 3. Auto Deploy on Merge to Main

This deploys your app when PR is merged.

## 📁 `.github/workflows/deploy.yml`

### Example: Deploy React + Node (Vercel + Render)



```yaml id="deploy1"
name: Auto Deploy

on:
  push:
    branches: [ main ]

jobs:
  deploy-frontend:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Install frontend
        working-directory: client
        run: npm install

      - name: Build frontend
        working-directory: client
        run: npm run build

      - name: Deploy to Vercel
        run: npx vercel --prod --token=${{ secrets.VERCEL_TOKEN }}

  deploy-backend:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Install backend
        working-directory: server
        run: npm install

      - name: Deploy backend (Render webhook)
        run: curl -X POST ${{ secrets.RENDER_DEPLOY_HOOK }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🔐 4. GitHub Secrets Setup
&lt;/h1&gt;

&lt;p&gt;Go to:&lt;/p&gt;

&lt;p&gt;👉 Repo → Settings → Secrets → Actions&lt;/p&gt;

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

&lt;p&gt;```plaintext id="sec1"&lt;br&gt;
VERCEL_TOKEN=your_vercel_token&lt;br&gt;
RENDER_DEPLOY_HOOK=&lt;a href="https://api.render.com/deploy/xxx" rel="noopener noreferrer"&gt;https://api.render.com/deploy/xxx&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# 🧭 5. Full Workflow in action

## Developer flow:



```plaintext id="flow2"
git checkout -b feature-login
git push origin feature-login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Then GitHub automatically:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;🤖 Creates Pull Request&lt;/li&gt;
&lt;li&gt;🧪 Runs CI checks&lt;/li&gt;
&lt;li&gt;👀 Waits for review (optional)&lt;/li&gt;
&lt;li&gt;🔀 Merge to main&lt;/li&gt;
&lt;li&gt;🚀 Auto deploys frontend + backend&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  🔥 6. Upgrade (what real companies add)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🟢 Add approval rule (recommended)
&lt;/h2&gt;

&lt;p&gt;In GitHub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Require 1–2 reviewers&lt;/li&gt;
&lt;li&gt;Require CI to pass before merge&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🟡 Add branch protection
&lt;/h2&gt;

&lt;p&gt;Settings → Branches → &lt;code&gt;main&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Enable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Require PR before merging&lt;/li&gt;
&lt;li&gt;Require status checks&lt;/li&gt;
&lt;li&gt;Block direct pushes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔵 Add notifications (Slack/Discord)
&lt;/h2&gt;



&lt;p&gt;```yaml id="notif1"&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name: Notify Slack
run: |
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"New deployment to production 🚀"}' \
${{ secrets.SLACK_WEBHOOK }}
```
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🟣 Add version tagging
&lt;/h2&gt;



&lt;p&gt;```bash id="tag1"&lt;br&gt;
git tag v1.0.0&lt;br&gt;
git push origin v1.0.0&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# ⚠️ Common mistakes

### ❌ Auto-deploy without tests

→ leads to broken production

### ❌ No branch protection

→ anyone can push to main

### ❌ Missing secrets

→ deployment fails silently

---

# 🧠 Final Architecture (Pro level)



```plaintext id="final1"
Feature Branch
   ↓
Auto PR Created
   ↓
CI (tests + lint)
   ↓
Review + Approval
   ↓
Merge to main
   ↓
CD Pipeline
   ↓
Frontend deploy (Vercel)
Backend deploy (Render/AWS)
   ↓
Slack/Discord notification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>automation</category>
      <category>cicd</category>
      <category>devops</category>
      <category>github</category>
    </item>
    <item>
      <title>CI/CD Pipline</title>
      <dc:creator>Kyle Y. Parsotan</dc:creator>
      <pubDate>Sat, 23 May 2026 20:58:51 +0000</pubDate>
      <link>https://dev.to/kyl67899/cicd-pipline-gmm</link>
      <guid>https://dev.to/kyl67899/cicd-pipline-gmm</guid>
      <description>&lt;p&gt;Here’s a real-world CI/CD pipeline setup for a React frontend + Node.js backend + deployment using GitHub Actions**. This is very close to what startups actually use.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚀 Full CI/CD Pipeline (React + Node + GitHub Actions)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🧱 Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend (React)  →  Backend (Node/Express)  →  Deployment (Vercel / Render / AWS)
        ↑                    ↑
     CI tests            CI tests
        ↓                    ↓
   GitHub Actions runs everything automatically
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📁 Example Project Structure
&lt;/h1&gt;



&lt;p&gt;```plaintext id="7p0k1m"&lt;br&gt;
my-app/&lt;br&gt;
 ├── client/        # React app&lt;br&gt;
 ├── server/        # Node.js API&lt;br&gt;
 ├── .github/&lt;br&gt;
 │    └── workflows/&lt;br&gt;
 │         └── ci-cd.yml&lt;br&gt;
 ├── package.json&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# ⚙️ CI Pipeline (Testing both React + Node)

This workflow runs on every push and pull request.



```yaml id="ci1234"
name: Full CI Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test-frontend:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Install frontend dependencies
        working-directory: client
        run: npm install

      - name: Run frontend tests
        working-directory: client
        run: npm test

  test-backend:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Install backend dependencies
        working-directory: server
        run: npm install

      - name: Run backend tests
        working-directory: server
        run: npm test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🚀 CD Pipeline (Deployment)
&lt;/h1&gt;

&lt;p&gt;Now we deploy when everything passes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: Deploy backend + frontend
&lt;/h3&gt;



&lt;p&gt;```yaml id="cd5678"&lt;br&gt;
name: Deploy Pipeline&lt;/p&gt;

&lt;p&gt;on:&lt;br&gt;
  push:&lt;br&gt;
    branches: [ main ]&lt;/p&gt;

&lt;p&gt;jobs:&lt;br&gt;
  deploy-backend:&lt;br&gt;
    runs-on: ubuntu-latest&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;steps:
  - uses: actions/checkout@v4

  - name: Install backend
    working-directory: server
    run: npm install

  - name: Build backend
    working-directory: server
    run: npm run build

  - name: Deploy backend to Render
    run: |
      curl -X POST ${{ secrets.RENDER_DEPLOY_HOOK }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;deploy-frontend:&lt;br&gt;
    runs-on: ubuntu-latest&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;steps:
  - uses: actions/checkout@v4

  - name: Install frontend
    working-directory: client
    run: npm install

  - name: Build React app
    working-directory: client
    run: npm run build

  - name: Deploy to Vercel
    run: |
      npx vercel --prod --token=${{ secrets.VERCEL_TOKEN }}
&lt;/code&gt;&lt;/pre&gt;

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


---

# 🔐 GitHub Secrets (IMPORTANT)

You must store sensitive keys in:

👉 GitHub Repo → Settings → Secrets and Variables

Example secrets:



```plaintext id="sec123"
VERCEL_TOKEN=your-vercel-token
RENDER_DEPLOY_HOOK=https://api.render.com/deploy/xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🧪 What happens when you push code?
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Example flow:
&lt;/h3&gt;



&lt;p&gt;```plaintext id="flow123"&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You push code to GitHub&lt;/li&gt;
&lt;li&gt;GitHub Actions starts CI&lt;/li&gt;
&lt;li&gt;Runs:

&lt;ul&gt;
&lt;li&gt;React tests&lt;/li&gt;
&lt;li&gt;Node API tests&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If ALL pass:

&lt;ul&gt;
&lt;li&gt;Builds frontend&lt;/li&gt;
&lt;li&gt;Builds backend&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CD triggers:

&lt;ul&gt;
&lt;li&gt;Deploy backend (Render/AWS)&lt;/li&gt;
&lt;li&gt;Deploy frontend (Vercel)
```
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  🧠 What real companies add on top
&lt;/h1&gt;

&lt;h3&gt;
  
  
  🔥 1. Linting
&lt;/h3&gt;



&lt;p&gt;```yaml id="lint1"&lt;br&gt;
run: npm run lint&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

### 🔥 Code formatting check



```yaml id="fmt1"
run: npm run format:check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔥 Caching (faster builds)
&lt;/h3&gt;



&lt;p&gt;```yaml id="cache1"&lt;br&gt;
uses: actions/cache@v4&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

### 🔥 Database migrations (backend)



```yaml id="db1"
run: npm run migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔥 Parallel jobs
&lt;/h3&gt;

&lt;p&gt;Frontend + backend run at the same time (already shown above)&lt;/p&gt;




&lt;h1&gt;
  
  
  🚀 Real-world deployment options
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vercel (most common)&lt;/li&gt;
&lt;li&gt;Netlify&lt;/li&gt;
&lt;li&gt;AWS S3 + CloudFront&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Render&lt;/li&gt;
&lt;li&gt;Railway&lt;/li&gt;
&lt;li&gt;AWS EC2 / ECS&lt;/li&gt;
&lt;li&gt;DigitalOcean&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  ⚠️ Common mistakes in CI/CD
&lt;/h1&gt;

&lt;h3&gt;
  
  
  ❌ No environment variables
&lt;/h3&gt;

&lt;p&gt;→ app works locally but fails in CI&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Missing build step
&lt;/h3&gt;

&lt;p&gt;→ deployment breaks&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Not separating frontend/backend
&lt;/h3&gt;

&lt;p&gt;→ messy pipeline&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ No test stage
&lt;/h3&gt;

&lt;p&gt;→ broken code gets deployed&lt;/p&gt;




&lt;h1&gt;
  
  
  🧭 Production-grade CI/CD flow
&lt;/h1&gt;



&lt;p&gt;```plaintext id="prod1"&lt;br&gt;
Push → CI Tests → Build → Approval (optional) → Deploy → Monitor&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# 💡 Final Summary

A real CI/CD pipeline:

* Tests frontend + backend automatically
* Builds apps only if tests pass
* Deploys without manual work
* Prevents broken code from reaching users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>cicd</category>
      <category>devops</category>
      <category>node</category>
      <category>react</category>
    </item>
  </channel>
</rss>
