<?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>Forem: Bakare Muideen Adeleke</title>
    <description>The latest articles on Forem by Bakare Muideen Adeleke (@adeleke123).</description>
    <link>https://forem.com/adeleke123</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1420649%2Ff496cbaa-d3f0-4fa0-a2b2-26762bdd7ae4.jpeg</url>
      <title>Forem: Bakare Muideen Adeleke</title>
      <link>https://forem.com/adeleke123</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/adeleke123"/>
    <language>en</language>
    <item>
      <title>From Flask App to CI/CD Pipeline with GitHub Actions &amp; Docker Hub</title>
      <dc:creator>Bakare Muideen Adeleke</dc:creator>
      <pubDate>Sun, 13 Apr 2025 10:56:23 +0000</pubDate>
      <link>https://forem.com/adeleke123/from-flask-app-to-cicd-pipeline-with-github-actions-docker-hub-aoa</link>
      <guid>https://forem.com/adeleke123/from-flask-app-to-cicd-pipeline-with-github-actions-docker-hub-aoa</guid>
      <description>&lt;p&gt;DevOps is all about bridging development and operations. For this project, I decided to get hands on by containerizing a simple web application and automating its deployment pipeline.&lt;/p&gt;

&lt;p&gt;Here’s how I built a complete CI/CD workflow from scratch using&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python + Flask&lt;/strong&gt; for the web app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; for containerization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; for version control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt; for CI/CD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Hub&lt;/strong&gt; for image hosting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Step 1: Create a Simple Flask Application&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.1 Set up a project folder&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1.2 Create a virtual environment and install Flask&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1.3 Create your Flask app&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a file called &lt;code&gt;app.py&lt;/code&gt; and paste this in:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1.4 Run the app locally&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5jktbhjto73r2l4hqhv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5jktbhjto73r2l4hqhv.png" alt="Host" width="800" height="173"&gt;&lt;/a&gt;&lt;br&gt;
Then open your browser and go to &lt;code&gt;http://localhost:5000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;✅ Step 2: Containerize the Application&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.1 Create a&lt;/strong&gt; &lt;code&gt;Dockerfile&lt;/code&gt;&lt;br&gt;
Create a file called &lt;code&gt;Dockerfile&lt;/code&gt; (no extension) in the root folder:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;2.2 Create&lt;/strong&gt; &lt;code&gt;.dockerignore&lt;/code&gt;&lt;br&gt;
Create a file named &lt;code&gt;.dockerignore&lt;/code&gt;:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;2.3 Build the Docker image&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;2.4 Run the container&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Open &lt;code&gt;http://localhost:5000&lt;/code&gt; in your browser again. You should see &lt;strong&gt;Hello DevOps!&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;✅ Step 3: Set Up Version Control&lt;/p&gt;

&lt;p&gt;Next, I pushed the project to GitHub to manage changes and integrate CI/CD workflows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git init
git add .
git commit -m "Run"
git remote add origin https://github.com/adeleke123/flask-devops-app.git
git push -u origin main

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

&lt;/div&gt;



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

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

&lt;p&gt;🔁 Step 4: Implement CI/CD with GitHub Actions&lt;/p&gt;

&lt;p&gt;This is the fun part — automating the build and deployment using &lt;strong&gt;GitHub Actions&lt;/strong&gt; and pushing the Docker image to &lt;strong&gt;Docker Hub&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.1 🔐 Set Up Docker Hub Secrets in GitHub&lt;/strong&gt;&lt;br&gt;
I created a personal access token in Docker Hub, then added the following secrets to GitHub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DOCKER_USERNAME&lt;/code&gt; – my Docker Hub username&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DOCKER_TOKEN&lt;/code&gt; – Docker Hub access token&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Location: GitHub Repo → Settings → Secrets and variables → Actions&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;4.2 🛠 Created the GitHub Actions Workflow&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Once I pushed the workflow file, the GitHub Action triggered automatically, built my Docker image and pushed it to Docker Hub.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;🐳 Final Result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can find the container image here on Docker Hub:&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://hub.docker.com/repository/docker/bakare1234844/flask-devops-app" rel="noopener noreferrer"&gt;https://hub.docker.com/repository/docker/bakare1234844/flask-devops-app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the source code on GitHub:&lt;br&gt;
🔗 &lt;a href="https://github.com/adeleke123/flask-devops-app" rel="noopener noreferrer"&gt;https://github.com/adeleke123/flask-devops-app&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>12 FACTOR APP METHODOLOGY</title>
      <dc:creator>Bakare Muideen Adeleke</dc:creator>
      <pubDate>Tue, 04 Feb 2025 15:24:25 +0000</pubDate>
      <link>https://forem.com/adeleke123/12-factor-app-methodology-1e57</link>
      <guid>https://forem.com/adeleke123/12-factor-app-methodology-1e57</guid>
      <description>&lt;p&gt;In the modern landscape of cloud-native applications and continuous deployment, the need for scalable, maintainable and adaptable software systems has never been greater. The 12-Factor App methodology was created to provide a set of best practices for building and deploying web applications in the most efficient way possible, ensuring reliability, scalability and fast iteration cycles. By adhering to these principles, developers can create applications that are not only resilient and easy to maintain but also capable of scaling effortlessly in a rapidly evolving environment.&lt;/p&gt;

&lt;p&gt;This methodology is a comprehensive guide, focusing on critical areas like &lt;strong&gt;codebase management&lt;/strong&gt;, &lt;strong&gt;dependency handling&lt;/strong&gt;, &lt;strong&gt;configuration&lt;/strong&gt;, &lt;strong&gt;deployment and more&lt;/strong&gt;. Each factor provides valuable insight into optimizing the way applications are built, managed, and deployed, ensuring that they are both developer-friendly and production-ready.&lt;/p&gt;

&lt;p&gt;In this guide, I will explore each of the twelve factors in detail, diving into the specific practices that can be employed to enhance application development, deployment and maintenance. From handling web processes to managing logs, each factor plays an essential role in achieving the agility and scalability that modern web apps demand.&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;12-Factor App Methodology: Principle 1 – Codebase&lt;/strong&gt;&lt;br&gt;
When building scalable and maintainable applications, the 12-Factor App methodology provides a solid foundation. Let's start with the first principle: &lt;strong&gt;Codebase.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔹 One Codebase, Many Deploys&lt;br&gt;
A twelve-factor app follows strict version control practices (e.g., Git, Mercurial, Subversion), ensuring a single source of truth for the application.&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;What Does This Mean?&lt;/strong&gt;&lt;br&gt;
✅ One codebase per app → If you have multiple codebases, you're dealing with a distributed system, not a single app.&lt;br&gt;
✅ Multiple deploys → The same codebase is deployed in different environments (e.g., production, staging, local development).&lt;br&gt;
✅ No shared code between apps → Shared functionality should be extracted into libraries, managed via a package manager.&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; The same codebase powers all environments, ensuring consistency across deployments while allowing different versions to exist in various deploys.&lt;/p&gt;

&lt;p&gt;Would love to hear your thoughts! Have you worked with the 12-Factor methodology before? How has it shaped your development workflow? 💬👇&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;12-Factor App Methodology: Principle 2 – Dependencies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Managing dependencies effectively is critical for building portable and reliable applications. The second principle of the 12-Factor App methodology focuses on declaring and isolating dependencies.&lt;/p&gt;

&lt;p&gt;✅ Explicit Dependency Declaration&lt;br&gt;
A twelve-factor app does not assume system-wide dependencies. Instead, all dependencies are explicitly defined in a dependency manifest (e.g., package.json for Node.js, requirements.txt for Python, Gemfile for Ruby).&lt;/p&gt;

&lt;p&gt;✅ Isolation for Consistency&lt;br&gt;
Dependency isolation tools (like venv for Python, Bundler for Ruby, or Docker for containerized apps) prevent "dependency leakage", ensuring every environment has the exact same setup.&lt;/p&gt;

&lt;p&gt;✅ Why Does This Matter?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New developers can quickly onboard by installing dependencies with a single command.&lt;/li&gt;
&lt;li&gt;No surprises in production—every deploy gets a deterministic build.&lt;/li&gt;
&lt;li&gt;Avoids breaking changes due to system-wide updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; If your app relies on external tools like curl or ImageMagick, don't assume they'll always be available—they should be included as dependencies or packaged with the app.&lt;/p&gt;

&lt;p&gt;What dependency management challenges have you faced in your projects? Let’s discuss! 💬👇&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;12-Factor App Methodology: Principle 3 – Config&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the most common mistakes in application development is hardcoding configuration values into the codebase. The third principle of the 12-Factor App methodology emphasizes storing config in the environment, ensuring flexibility, security, and scalability.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;What is Config?&lt;/strong&gt;&lt;br&gt;
Configuration includes everything that varies between deploys, such as:&lt;br&gt;
Database URLs and credentials 🛢️&lt;br&gt;
API keys and third-party service credentials 🔑&lt;br&gt;
Environment-specific settings (staging, production, dev) 🌍&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Common Mistakes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1️⃣ Hardcoding secrets in code → Security risk if the repo is leaked!&lt;br&gt;
2️⃣ Using config files checked into version control → Easy to accidentally commit sensitive data.&lt;br&gt;
3️⃣ Grouping config into predefined environments → Becomes unmanageable as deployments increase.&lt;/p&gt;

&lt;p&gt;✅ The Twelve-Factor Way: Environment Variables&lt;br&gt;
📌 Config should be stored in environment variables (ENV VARs), making it:&lt;br&gt;
 ✔️ Easier to change per deployment (without modifying code)&lt;br&gt;
 ✔️ More secure (not stored in version control)&lt;br&gt;
 ✔️ Language-agnostic (works across any OS or framework)&lt;/p&gt;

&lt;p&gt;💡 Example (Node.js):&lt;br&gt;
 Instead of:&lt;br&gt;
&lt;code&gt;const DB_URL = "mysql://user:password@localhost:3306/db";  // ❌ Hardcoded!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Use:&lt;br&gt;
&lt;code&gt;const DB_URL = process.env.DB_URL;  // ✅ Stored in an environment variable&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🔎 Key Takeaway&lt;br&gt;
Your code should be open-source-ready at any moment without exposing sensitive credentials. Separating config from code is not just good practice—it’s essential for scalability and security.&lt;/p&gt;

&lt;p&gt;How do you manage configuration in your apps? Drop your thoughts below! 💬👇&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;12-Factor App Methodology: Principle 4 – Backing Services&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In modern software development, applications rely on multiple backing services—databases, caching layers, messaging queues and third-party APIs. A well-architected app should treat these services as attached resources rather than hardwired dependencies.&lt;/p&gt;

&lt;p&gt;✅ What Are Backing Services?&lt;br&gt;
Any external service your app communicates with over the network, such as:&lt;br&gt;
 🔹 Databases (MySQL, PostgreSQL)&lt;br&gt;
 🔹 Caching systems (Redis, Memcached)&lt;br&gt;
 🔹 Message queues (RabbitMQ, Kafka)&lt;br&gt;
 🔹 Email services (SMTP, SendGrid)&lt;br&gt;
 🔹 File storage (Amazon S3, Google Cloud Storage)&lt;/p&gt;

&lt;p&gt;❌ Common Pitfalls&lt;/p&gt;

&lt;p&gt;1️⃣ Tightly coupling the app to local services → Makes migration difficult.&lt;br&gt;
2️⃣ Hardcoding service configurations → Limits flexibility and scalability.&lt;br&gt;
3️⃣ Differentiating between local and third-party services → Causes inconsistencies.&lt;/p&gt;

&lt;p&gt;✅ The Twelve-Factor Way: Treat Backing Services as Attached Resources&lt;br&gt;
📌 Your app should:&lt;br&gt;
✔️ Access all backing services via environment variables (stored config).&lt;br&gt;
✔️ Be able to swap services without code changes (e.g., switch from local PostgreSQL to a managed database like Amazon RDS).&lt;br&gt;
✔️ Treat local and third-party services the same way (via a standard interface like a URL).&lt;br&gt;
&lt;code&gt;&lt;br&gt;
💡 Example (Node.js – connecting to a database):&lt;br&gt;
 Instead of:&lt;br&gt;
const db = mysql.createConnection({&lt;br&gt;
  host: "localhost",&lt;br&gt;
  user: "root",&lt;br&gt;
  password: "password",&lt;br&gt;
  database: "mydb"&lt;br&gt;
});  // ❌ Tightly coupled to localhost DB&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Use:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
const db = mysql.createConnection(process.env.DATABASE_URL);  // ✅ Swappable service&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🔎 Key Takeaway&lt;br&gt;
Your app should not care whether its database is local or cloud-based, whether email is sent via Postfix or SendGrid—it should just work. This approach ensures flexibility, scalability, and resilience.&lt;/p&gt;

&lt;p&gt;How do you handle backing services in your projects? Let’s discuss! 💬👇&lt;/p&gt;

&lt;p&gt;🚀&lt;strong&gt;12-Factor App Methodology: Principle 5 – Build, Release, Run&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deploying an application isn’t just about pushing code—it’s about ensuring a structured, repeatable and reliable deployment process. The 12-Factor App methodology enforces strict separation between Build, Release, and Run stages.&lt;/p&gt;

&lt;p&gt;🔄 Three Stages of Deployment&lt;/p&gt;

&lt;p&gt;1️⃣ Build Stage 🛠️&lt;br&gt;
Converts source code into an executable bundle.&lt;br&gt;
Fetches dependencies, compiles binaries, and processes assets.&lt;br&gt;
Example: Running npm run build in a Node.js app.&lt;/p&gt;

&lt;p&gt;2️⃣ Release Stage 🎯&lt;br&gt;
Combines the build with environment-specific config (e.g., database URLs, API keys).&lt;br&gt;
Produces a versioned, immutable release ready for execution.&lt;/p&gt;

&lt;p&gt;3️⃣ Run Stage ⚡&lt;br&gt;
Executes the selected release in a runtime environment.&lt;br&gt;
Cannot modify code—only runs the built release.&lt;/p&gt;

&lt;p&gt;Example: Running docker run myapp:v1.0.0 or deploying to a server.&lt;/p&gt;

&lt;p&gt;❌ Common Deployment Pitfalls&lt;/p&gt;

&lt;p&gt;🚫 Modifying code in production – Changes don’t persist and may cause inconsistencies.&lt;br&gt;
🚫 Mixing build and runtime logic – Leads to unrepeatable deployments.&lt;br&gt;
🚫 Not versioning releases – Makes rollbacks impossible.&lt;/p&gt;

&lt;p&gt;✅ The Twelve-Factor Way: Strictly Separate Build, Release, and Run&lt;br&gt;
✔️ The build never changes after it's created.&lt;br&gt;
✔️ Each release gets a unique, immutable ID (v1.0.3, 2025-02-01T10:00Z).&lt;br&gt;
✔️ Rollbacks are easy—just revert to a previous release.&lt;br&gt;
`&lt;br&gt;
💡 Example (Deploying a Node.js app with Docker):&lt;/p&gt;

&lt;h1&gt;
  
  
  Build stage
&lt;/h1&gt;

&lt;p&gt;docker build -t myapp:1.0.0 .&lt;/p&gt;

&lt;h1&gt;
  
  
  Release stage (store image with config)
&lt;/h1&gt;

&lt;p&gt;docker tag myapp:1.0.0 myregistry.com/myapp:1.0.0&lt;br&gt;
docker push myregistry.com/myapp:1.0.0&lt;/p&gt;

&lt;h1&gt;
  
  
  Run stage (execute release)
&lt;/h1&gt;

&lt;p&gt;docker run -d --env-file=.env myregistry.com/myapp:1.0.0&lt;br&gt;&lt;br&gt;
`&lt;br&gt;
🔎 Key Takeaway&lt;br&gt;
A robust deployment process prevents inconsistencies, unexpected failures, and downtime. By enforcing clear separation, you ensure reliability, easy rollbacks, and predictable deployments.&lt;/p&gt;

&lt;p&gt;How do you handle deployments in your projects? Let’s discuss! 💬👇&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;12-Factor App Methodology: Principle 6 – Processes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A 12-Factor App is designed to run as stateless, share-nothing processes that can scale independently. This ensures reliability, fault tolerance, and horizontal scaling across multiple environments.&lt;/p&gt;

&lt;p&gt;🔄 What This Means&lt;br&gt;
✔️ The app is executed as one or more independent processes.&lt;br&gt;
✔️ Each process should be stateless—it doesn’t store persistent data in memory or local disk.&lt;br&gt;
✔️ Persistent data should be stored in backing services like databases, Redis, or S3.&lt;br&gt;
✔️ Processes should be ephemeral—they can be restarted or replaced at any time.&lt;/p&gt;

&lt;p&gt;❌ Common Pitfalls to Avoid&lt;/p&gt;

&lt;p&gt;🚫 Relying on local memory for state – Data should persist in a database or cache.&lt;br&gt;
🚫 Using "sticky sessions" – Session data should be stored in Redis, Memcached, or another external store, not in-process memory.&lt;br&gt;
🚫 Saving files to the local filesystem – Use cloud storage (e.g., AWS S3, Google Cloud Storage) instead.&lt;/p&gt;

&lt;p&gt;✅ The Twelve-Factor Way&lt;br&gt;
✔️ If a process dies, another one can take over without data loss.&lt;br&gt;
✔️ Horizontal scaling is easier—just add more processes to handle traffic spikes.&lt;br&gt;
✔️ Stateless processes work well in distributed systems, Kubernetes, and serverless environments.&lt;br&gt;
`&lt;br&gt;
💡 Example: Scaling a Node.js App&lt;/p&gt;

&lt;h1&gt;
  
  
  Start a stateless web process
&lt;/h1&gt;

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

&lt;h1&gt;
  
  
  Scale up processes dynamically
&lt;/h1&gt;

&lt;p&gt;pm2 scale app 4  # Run 4 instances of the app&lt;/p&gt;

&lt;p&gt;💡 Better approach: Store sessions in Redis&lt;br&gt;
const session = require('express-session');&lt;br&gt;
const RedisStore = require('connect-redis')(session);&lt;/p&gt;

&lt;p&gt;app.use(session({&lt;br&gt;
  store: new RedisStore({ host: 'localhost', port: 6379 }),&lt;br&gt;
  secret: 'your-secret',&lt;br&gt;
  resave: false,&lt;br&gt;
  saveUninitialized: false&lt;br&gt;
}));&lt;/p&gt;

&lt;p&gt;`&lt;br&gt;
🔎 Key Takeaway&lt;br&gt;
By making processes stateless and share-nothing, apps become more scalable, resilient, and easier to manage in cloud-native environments.&lt;/p&gt;

&lt;p&gt;How do you manage state in your applications? Let’s discuss! 💬👇&lt;/p&gt;

&lt;p&gt;🚀&lt;strong&gt;12-Factor App Methodology: Principle 7 – Port Binding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One key principle of 12-Factor Apps is that they should be self-contained and export services via port binding. This means that instead of relying on an external web server (e.g., Apache, Nginx, or Tomcat), the app itself should handle incoming requests by binding to a port.&lt;/p&gt;

&lt;p&gt;🔄 What This Means&lt;/p&gt;

&lt;p&gt;✔️ The app runs independently and listens on a specified port (e.g., 5000, 8080).&lt;br&gt;
✔️ No need for external web servers to inject dependencies at runtime.&lt;br&gt;
✔️ Routing layers (like Nginx, Kubernetes, or a cloud load balancer) can direct traffic to the app.&lt;br&gt;
✔️ Works with multiple protocols (HTTP, WebSockets, XMPP, Redis, etc.).&lt;/p&gt;

&lt;p&gt;❌ Common Pitfalls to Avoid&lt;/p&gt;

&lt;p&gt;🚫 Relying on platform-specific web servers (Apache, Nginx) to serve the app instead of embedding a web server.&lt;br&gt;
🚫 Assuming a fixed port instead of making the port configurable via environment variables.&lt;br&gt;
🚫 Hardcoding service URLs instead of dynamically resolving them from the config.&lt;/p&gt;

&lt;p&gt;✅ The Twelve-Factor Way&lt;br&gt;
✔️ Web servers are included in the app (e.g., Flask for Python, Express.js for Node.js, Spring Boot for Java).&lt;br&gt;
✔️ The app binds to a port and listens for incoming requests.&lt;br&gt;
✔️ Configuration (including the port) is set via environment variables for flexibility.&lt;br&gt;
`&lt;br&gt;
💡 Example: Running a Node.js Server&lt;br&gt;
const express = require('express');&lt;br&gt;
const app = express();&lt;/p&gt;

&lt;p&gt;const PORT = process.env.PORT || 3000;  // Bind to a port&lt;/p&gt;

&lt;p&gt;app.get('/', (req, res) =&amp;gt; {&lt;br&gt;
  res.send('Hello, Twelve-Factor!');&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;app.listen(PORT, () =&amp;gt; {&lt;br&gt;
  console.log(&lt;code&gt;App running on port ${PORT}&lt;/code&gt;);&lt;br&gt;
});&lt;br&gt;
`&lt;br&gt;
🔎 Key Takeaway&lt;/p&gt;

&lt;p&gt;By binding services to ports, apps become portable, scalable and cloud-ready. This approach makes it easy to deploy the same app across different environments (local, staging, production) without modification.&lt;/p&gt;

&lt;p&gt;How do you manage port binding in your applications? Let’s discuss! 💬👇&lt;/p&gt;

&lt;p&gt;🚀&lt;strong&gt;12-Factor App Methodology: Principle 8 – Concurrency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The eighth principle of the 12-Factor App is all about scaling out through the process model. In this model, processes are the foundation of concurrency and scaling for web apps.&lt;/p&gt;

&lt;p&gt;🔄 What This Means&lt;/p&gt;

&lt;p&gt;✔️ Scaling out via the process model means adding more processes to handle increased load, rather than increasing the size of a single process (vertical scaling).&lt;br&gt;
✔️ Processes in a twelve-factor app are designed to be stateless and independent, so they can be scaled horizontally (across multiple machines or containers).&lt;br&gt;
✔️ Apps are built using different process types, each dedicated to handling a specific type of workload:&lt;br&gt;
Web processes for handling HTTP requests&lt;br&gt;
Worker processes for handling background tasks or jobs&lt;/p&gt;

&lt;p&gt;📈 Scaling Out&lt;br&gt;
When scaling, rather than modifying the app’s code, you just add more processes. This horizontal scaling is key to a robust, scalable app that can handle high traffic or complex workloads.&lt;/p&gt;

&lt;p&gt;🛠 What to Avoid&lt;br&gt;
🚫 Daemonizing processes: Twelve-factor apps do not daemonize. They rely on operating system process managers (e.g., systemd, Kubernetes, Foreman) to handle processes and restarts.&lt;br&gt;
🚫 Using internal multiplexing as the only form of concurrency: For example, using threads or async models alone won’t scale horizontally if you’re stuck with vertical scaling.&lt;/p&gt;

&lt;p&gt;✅ The Twelve-Factor Way&lt;br&gt;
✔️ Processes are first-class citizens and can be added or removed easily without disrupting the app’s functionality.&lt;br&gt;
✔️ Each process type is responsible for a single task. For example, one process might handle web traffic, while another might process background jobs or perform data synchronization.&lt;br&gt;
✔️ No single process holds all responsibilities. This enables you to scale parts of the app independently based on demand.&lt;/p&gt;

&lt;p&gt;🔎 Key Takeaway&lt;br&gt;
By embracing horizontal scaling via the process model, your app can grow reliably and efficiently to meet increasing demand without compromising performance or flexibility.&lt;/p&gt;

&lt;p&gt;How do you approach scaling in your app architecture? Let’s talk about your experiences! 💬👇&lt;/p&gt;

&lt;p&gt;🚀&lt;strong&gt;12-Factor App Methodology: Principle 9 – Disposability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The ninth principle of the 12-Factor App is all about maximizing robustness with fast startup and graceful shutdown.&lt;/p&gt;

&lt;p&gt;⚡️ Fast Startup&lt;br&gt;
Processes in a twelve-factor app should be disposable — meaning they can be started or stopped quickly at any moment. This results in:&lt;br&gt;
✔️ Fast scaling&lt;br&gt;
✔️ Rapid deployment of code/config changes&lt;br&gt;
✔️ Enhanced production deploys robustness&lt;/p&gt;

&lt;p&gt;A key trait of disposable processes is short startup times. Ideally, a process should be up and running within seconds, allowing for rapid scaling and more agile releases. The faster a process starts, the quicker it can respond to changes and traffic spikes.&lt;/p&gt;

&lt;p&gt;🛑 Graceful Shutdown&lt;br&gt;
Processes also need to handle graceful shutdowns. When a process receives a SIGTERM signal (from the process manager), it should:&lt;br&gt;
Stop accepting new requests&lt;br&gt;
Allow in-progress requests or jobs to finish&lt;br&gt;
Exit cleanly&lt;/p&gt;

&lt;p&gt;For example, when a web process gets a SIGTERM:&lt;br&gt;
🔄 It ceases to listen on the service port, ensuring no new requests are processed.&lt;br&gt;
⏳ Ongoing requests are allowed to finish before the process exits.&lt;br&gt;
For worker processes, graceful shutdown means returning unfinished tasks to the queue, ensuring the system can retry jobs as needed.&lt;/p&gt;

&lt;p&gt;⚠️ Handling Sudden Death&lt;/p&gt;

&lt;p&gt;While graceful shutdowns are ideal, sudden hardware failures or crashes can still happen. A twelve-factor app is designed to handle such failures through mechanisms like:&lt;br&gt;
✔️ Robust queueing backends (e.g., Beanstalkd, RabbitMQ)&lt;br&gt;
✔️ Jobs are safely returned to queues or handled in a way that guarantees no data loss, even during unexpected shutdowns.&lt;/p&gt;

&lt;p&gt;✅ Best Practices&lt;br&gt;
✔️ Crash-only design: Systems should be built to handle failures gracefully, and restart automatically when needed.&lt;br&gt;
✔️ Use transactional, idempotent job processing: To ensure jobs can be retried without side effects.&lt;/p&gt;

&lt;p&gt;🔎 Key Takeaway&lt;br&gt;
By embracing disposability, apps become more agile, resilient, and robust, capable of handling scaling demands and sudden failures with ease.&lt;/p&gt;

&lt;p&gt;How do you handle graceful shutdowns and rapid deployments in your system? Share your experiences! 💬👇&lt;/p&gt;

&lt;p&gt;🚀&lt;strong&gt;12-Factor App Methodology: Principle 10 – Dev/Prod Parity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tenth principle of the 12-Factor App emphasizes the importance of keeping development, staging, and production environments as similar as possible to ensure smooth and rapid deployment cycles.&lt;/p&gt;

&lt;p&gt;⏳ Close the Gaps&lt;/p&gt;

&lt;p&gt;In traditional app development, there have historically been three significant gaps between development and production environments:&lt;br&gt;
Time Gap: Development can take days, weeks, or even months before the code is deployed to production.&lt;br&gt;
Personnel Gap: Developers write code, but different teams (e.g., ops engineers) handle deployment.&lt;/p&gt;

&lt;p&gt;✔️ Tools Gap: Developers use a different stack (e.g., SQLite, Nginx) than what’s used in production (e.g., MySQL, Apache).&lt;/p&gt;

&lt;p&gt;🕰 The 12-Factor Approach to Closing the Gaps&lt;br&gt;
The twelve-factor app reduces these gaps and aims for:&lt;br&gt;
✔️ Small time gap: Code written by developers gets deployed hours or even minutes later.&lt;br&gt;
✔️ Small personnel gap: Developers who wrote the code are directly involved in deployment and monitoring production behavior.&lt;br&gt;
✔️ Small tools gap: Development and production environments are kept as similar as possible, reducing friction and errors.&lt;/p&gt;

&lt;p&gt;🔄 Continuous Deployment&lt;br&gt;
By minimizing the gaps, twelve-factor apps can achieve continuous deployment, where new code and changes are rapidly deployed to production with little friction or downtime.&lt;/p&gt;

&lt;p&gt;⚙️ Backing Services in Dev/Prod Parity&lt;br&gt;
A crucial element is maintaining consistency in backing services, such as databases, queues, and caches, between dev and production. Differences in backing services (e.g., SQLite in dev and PostgreSQL in production) can introduce tiny incompatibilities, which lead to bugs and friction in deployment.&lt;/p&gt;

&lt;p&gt;Examples of backing services that need parity:&lt;br&gt;
🔗 Database: ActiveRecord in Ruby on Rails, supporting MySQL, PostgreSQL, SQLite.&lt;br&gt;
🔗 Queue: Celery in Python/Django, supporting RabbitMQ, Beanstalkd, Redis.&lt;br&gt;
🔗 Cache: ActiveSupport::Cache in Ruby on Rails, supporting memory, filesystem, or Memcached.&lt;/p&gt;

&lt;p&gt;The goal is to resist using lightweight services locally, as this can cause small, difficult-to-diagnose issues when deploying to production.&lt;/p&gt;

&lt;p&gt;⚡️ How to Achieve Dev/Prod Parity&lt;br&gt;
Modern packaging systems like Homebrew, apt-get, Docker, and Vagrant make it easy to set up local environments that mimic production setups.&lt;br&gt;
Using declarative provisioning tools like Chef or Puppet ensures your local and production environments are in sync.&lt;br&gt;
Always use the same type and version of services across environments to avoid surprises.&lt;/p&gt;

&lt;p&gt;✅ Key Takeaway&lt;br&gt;
By maintaining dev/prod parity, you improve continuous deployment, reduce friction, and ensure that what works in development works in production without unexpected failures.&lt;/p&gt;

&lt;p&gt;How do you ensure dev/prod parity in your environment? Share your strategies! 💬👇&lt;/p&gt;

&lt;p&gt;🚀&lt;strong&gt;12-Factor App Methodology: Principle 11 – Logs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Logs are essential for understanding the behavior and health of a running app. But, according to the 12-Factor App methodology, logs are treated as event streams—continuous and aggregated data that provide real-time visibility into your app's activity.&lt;/p&gt;

&lt;p&gt;📜 Logs as Event Streams&lt;br&gt;
Rather than writing logs to files on disk, logs in a twelve-factor app are a stream of time-ordered events generated from the output streams of all running processes and backing services. These logs are unbuffered and continuously flowing as long as the app is running.&lt;br&gt;
The log events are typically in plain text format, one event per line (with multi-line events for backtraces). Importantly, logs have no fixed beginning or end—they keep streaming as the app operates.&lt;/p&gt;

&lt;p&gt;🧳 No File Management&lt;br&gt;
The app should never manage its own log files. It doesn’t concern itself with routing or storage of logs. Each running process simply writes its event stream to stdout (standard output).&lt;br&gt;
During local development, developers can view logs in the terminal to monitor behavior.&lt;br&gt;
In production, the environment captures and collates the logs, routing them to destinations like log indexing systems (e.g., Splunk) or data warehousing systems (e.g., Hadoop).&lt;/p&gt;

&lt;p&gt;🔄 Routing and Archiving Logs&lt;br&gt;
Logs are not visible to the app, nor can they be configured by it. Instead, they are routed to external destinations for viewing and long-term archival. Tools like Logplex or Fluentd can help with routing, making logs accessible for monitoring and post-mortem analysis.&lt;br&gt;
Logs are captured and processed in ways that help to:&lt;/p&gt;

&lt;p&gt;📅 Find specific events in the past.&lt;br&gt;
📊 Graph trends like request volume over time.&lt;br&gt;
🚨 Set up alerts for critical metrics (e.g., errors per minute).&lt;br&gt;
📈 Log Analysis and Power&lt;/p&gt;

&lt;p&gt;By sending logs to systems like Splunk or Hadoop, developers gain the power to:&lt;br&gt;
Visualize app behavior over time.&lt;br&gt;
Set up real-time alerting for abnormal patterns (such as spikes in errors).&lt;br&gt;
Build detailed graphs to track things like requests per minute, latency, and error rates.&lt;/p&gt;

&lt;p&gt;✅ Key Takeaway&lt;/p&gt;

&lt;p&gt;In the 12-Factor App world, logs aren’t just about checking file logs—they are powerful, continuous, and routed to sophisticated platforms for analysis and alerting. Treating logs as event streams maximizes the ability to monitor, scale, and debug the app.&lt;/p&gt;

&lt;p&gt;How do you manage logs in your application? What tools do you use to analyze log data? Share your experiences! 💬👇&lt;/p&gt;

&lt;p&gt;🚀&lt;strong&gt;12-Factor App Methodology: Principle 12 – Admin Processes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When it comes to performing administrative or maintenance tasks in your app, the 12-Factor App methodology recommends that you run these tasks as one-off processes. These tasks are separate from the regular business processes of the app, such as handling web requests, but they are equally important for maintaining and managing the app.&lt;/p&gt;

&lt;p&gt;🛠️ What are Admin Processes?&lt;br&gt;
Admin processes include tasks such as:&lt;br&gt;
Database migrations (e.g., rake db:migrate in Rails, manage.py migrate in Django).&lt;br&gt;
Running a REPL shell to interact with the app's live database or inspect models (e.g., rails console for Rails, python for Python).&lt;br&gt;
Executing one-time scripts, such as running a fix for bad records (e.g., php scripts/fix_bad_records.php).&lt;/p&gt;

&lt;p&gt;🔄 Consistency with Regular Processes&lt;br&gt;
The key principle here is that admin processes should run in the same environment as your regular long-running processes. This ensures consistency, as they are using the same codebase and configuration.&lt;br&gt;
For example, if your web process uses bundle exec thin start, your migration should use bundle exec rake db:migrate. Similarly, if you're using Virtualenv for Python, admin tasks like migrations should also use the same isolated environment.&lt;/p&gt;

&lt;p&gt;🖥️ Local vs. Production&lt;br&gt;
In local development, you invoke admin processes through direct shell commands. In production, you would typically use SSH or another remote command execution mechanism provided by your deploy environment to run the tasks.&lt;/p&gt;

&lt;p&gt;✅ Key Takeaway&lt;br&gt;
The 12-Factor App methodology ensures that admin processes are just as reliable and consistent as regular processes. By maintaining a consistent environment and dependency isolation, you can avoid issues where admin tasks fail due to environmental inconsistencies.&lt;/p&gt;

&lt;p&gt;What’s your approach for running admin tasks in your apps? Let’s chat in the comments! 💬👇&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>devops</category>
      <category>12factorapp</category>
      <category>scalability</category>
    </item>
    <item>
      <title>Day 2: Creating a Signup Page with Express.js – Building the Foundation for User Registration</title>
      <dc:creator>Bakare Muideen Adeleke</dc:creator>
      <pubDate>Sun, 01 Sep 2024 08:58:13 +0000</pubDate>
      <link>https://forem.com/adeleke123/day-2-creating-a-signup-page-with-expressjs-building-the-foundation-for-user-registration-2g3d</link>
      <guid>https://forem.com/adeleke123/day-2-creating-a-signup-page-with-expressjs-building-the-foundation-for-user-registration-2g3d</guid>
      <description>&lt;p&gt;Despite a busy schedule as a Customer Engineer, I found time to explore the process of creating a signup page using Express.js. Here’s a step by step breakdown of the process:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Explanation of Steps&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create an Express App:&lt;/strong&gt; Start by initializing a new Express.js application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc9dczgf85a56p9a0yty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc9dczgf85a56p9a0yty.png" alt="App" width="213" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a Port for the Server:&lt;/strong&gt; Define a port where your server will listen for requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwcde16h91g2265miasz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwcde16h91g2265miasz.png" alt="Server" width="287" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accept Body Data (Middleware):&lt;/strong&gt; Middleware functions are crucial in Express.js to handle and process requests before they reach your route handlers. Use middleware like &lt;strong&gt;express.json()&lt;/strong&gt; to handle incoming JSON or URL-encoded data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frttzcxkav8pgskghc586.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frttzcxkav8pgskghc586.png" alt="Middleware" width="286" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Have HTML Pages for Signup Form:&lt;/strong&gt; Design HTML pages to serve as the signup form interface. These pages will be served by your Express app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Name the API Endpoint as /api/v1/signup:&lt;/strong&gt; Define the signup API endpoint in your routes. This is where users will submit their signup information.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkkwkly88u4ydyz4218x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkkwkly88u4ydyz4218x.png" alt="Endpoint" width="286" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check if User Already Exists:&lt;/strong&gt; Implement logic to verify if the user is already registered in the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2rls17fzmt6yvlhtbsj1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2rls17fzmt6yvlhtbsj1.png" alt="user" width="287" height="119"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Validation of Input Data:&lt;/strong&gt; Validate the data submitted by the user, ensuring it meets the required criteria. Here's an example of the validators:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxmqfjqv8u9aw1fl8bbt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxmqfjqv8u9aw1fl8bbt.png" alt="Validator" width="285" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use Bcrypt to Encrypt the Password:&lt;/strong&gt; Utilize the Bcrypt library to hash the user's password for secure storage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7ejpnkwog1u25eb3c2y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7ejpnkwog1u25eb3c2y.png" alt="password" width="283" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Save User Data to Database:&lt;/strong&gt; If validation passes, save the user's data in the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnnfmm19a4ank9i5sdck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnnfmm19a4ank9i5sdck.png" alt="Database" width="283" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If Error Occurs, Send an Alert:&lt;/strong&gt; Handle errors gracefully by sending an alert or error message. For example:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0ipata3lojj8emce1xu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0ipata3lojj8emce1xu.png" alt="Alert" width="282" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redirect to Login Page or Dashboard:&lt;/strong&gt; Upon successful signup, redirect the user to the login page or directly to the dashboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F45vs279at8jpsi77cr8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F45vs279at8jpsi77cr8e.png" alt="Signup" width="282" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsts768gdodeoxgxwbgu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsts768gdodeoxgxwbgu.png" alt="signup" width="442" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe7ded62un0a96zrerej5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe7ded62un0a96zrerej5.png" alt="signin" width="442" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3syx2npcepl47c6u3yb3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3syx2npcepl47c6u3yb3.png" alt="Terminal" width="288" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Directory Structure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm59tj3tvt8ic18mtv0fw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm59tj3tvt8ic18mtv0fw.png" alt="Directory" width="287" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the link to the &lt;a href="https://github.com/adeleke123/Miva-Challenge" rel="noopener noreferrer"&gt;source code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By following these steps and understanding the underlying code, you can create a secure and efficient signup page using Express.js. Stay tuned as I continue to explore more topics in my #100DaysOfMiva challenge.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Next up, I’ll be diving into &lt;strong&gt;authentication with a database&lt;/strong&gt; to further enhance the security and functionality of this signup page.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>backend</category>
      <category>authentication</category>
      <category>express</category>
    </item>
    <item>
      <title>Day 1: Understanding APIs – The Backbone of Web Communication</title>
      <dc:creator>Bakare Muideen Adeleke</dc:creator>
      <pubDate>Wed, 21 Aug 2024 10:38:14 +0000</pubDate>
      <link>https://forem.com/adeleke123/day-1-understanding-apis-the-backbone-of-web-communication-4kn2</link>
      <guid>https://forem.com/adeleke123/day-1-understanding-apis-the-backbone-of-web-communication-4kn2</guid>
      <description>&lt;p&gt;Welcome to Day 1 of my #100DaysOfMiva challenge! Today, we’re diving into the fascinating world of APIs (Application Programming Interfaces). APIs are crucial in the backend development world, enabling different software systems to communicate seamlessly. Let’s break down the key concepts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is an API?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An API, or Application Programming Interface, is a set of rules and protocols that allows one software application to interact with another. Think of it as a bridge that connects different systems, allowing them to exchange information and functionality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How APIs Work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a typical web application, the communication happens between a client (the web browser) and a server. Here’s a simplified overview:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Client-Server Model:&lt;/strong&gt; The client sends a request to the server, which processes this request and sends back a response. The client is typically a web browser, mobile app, or any other application that needs data from a server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Endpoints and Routes:&lt;/strong&gt; APIs use endpoints (specific URLs) and routes (paths) to handle requests. Each endpoint corresponds to a particular function or resource. For example, a &lt;strong&gt;GET /users&lt;/strong&gt; endpoint might return a list of users, while a &lt;strong&gt;POST /users&lt;/strong&gt; endpoint could create a new user.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fato6vrjp2afr4u6p149f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fato6vrjp2afr4u6p149f.png" alt="Image description" width="551" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Making API Calls&lt;/strong&gt;&lt;br&gt;
APIs use HTTP methods to define actions. Here are the most common methods:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GET:&lt;/strong&gt; Retrieves data from the server. For instance, a request to GET /products would fetch a list of products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;POST:&lt;/strong&gt; Sends data to the server to create a new resource. For example, POST /orders might be used to place a new order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PUT:&lt;/strong&gt; Updates an existing resource. A PUT /users/123 request could update the user with ID 123.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DELETE:&lt;/strong&gt; Removes a resource. Sending a DELETE /items/456 request would delete the item with ID 456.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6s4ort3tv4rlg40lkcev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6s4ort3tv4rlg40lkcev.png" alt="Image description" width="272" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP Status Codes&lt;/strong&gt;&lt;br&gt;
When the server responds to an API request, it also sends an HTTP status code. These codes indicate the result of the request.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;200 OK:&lt;/strong&gt; The request was successful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;201 Created:&lt;/strong&gt; The request was successful, and a new resource was created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;400 Bad Request:&lt;/strong&gt; The request was invalid or cannot be served.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;404 Not Found:&lt;/strong&gt; The requested resource could not be found.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;500 Internal Server Error:&lt;/strong&gt; The server encountered an error.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftvqsxvh64pzgt7o3efna.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftvqsxvh64pzgt7o3efna.png" alt="Image description" width="398" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s look at a practical example where i will send a GET request to retrieve a list of users:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://jsonplaceholder.org/users&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[&lt;br&gt;
    {&lt;br&gt;
        "id": 1,&lt;br&gt;
        "firstname": "John",&lt;br&gt;
        "lastname": "Doe",&lt;br&gt;
        "email": "johndoe@example.com",&lt;br&gt;
        "birthDate": "1973-01-22",&lt;br&gt;
        "login": {&lt;br&gt;
            "uuid": "1a0eed01-9430-4d68-901f-c0d4c1c3bf22",&lt;br&gt;
            "username": "johndoe",&lt;br&gt;
            "password": "jsonplaceholder.org",&lt;br&gt;
            "md5": "c1328472c5794a25723600f71c1b4586",&lt;br&gt;
            "sha1": "35544a31cc19bd6520af116554873167117f4d94",&lt;br&gt;
            "registered": "2023-01-10T10:03:20.022Z"&lt;br&gt;
        },&lt;br&gt;
        "address": {&lt;br&gt;
            "street": "123 Main Street",&lt;br&gt;
            "suite": "Apt. 4",&lt;br&gt;
            "city": "Anytown",&lt;br&gt;
            "zipcode": "12345-6789",&lt;br&gt;
            "geo": {&lt;br&gt;
                "lat": "42.1234",&lt;br&gt;
                "lng": "-71.2345"&lt;br&gt;
            }&lt;br&gt;
        },&lt;br&gt;
        "phone": "(555) 555-1234",&lt;br&gt;
        "website": "www.johndoe.com",&lt;br&gt;
        "company": {&lt;br&gt;
            "name": "ABC Company",&lt;br&gt;
            "catchPhrase": "Innovative solutions for all your needs",&lt;br&gt;
            "bs": "Marketing"&lt;br&gt;
        }&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        "id": 2,&lt;br&gt;
        "firstname": "Jane",&lt;br&gt;
        "lastname": "Smith",&lt;br&gt;
        "email": "janesmith@example.com",&lt;br&gt;
        "birthDate": "1983-02-22",&lt;br&gt;
        "login": {&lt;br&gt;
            "uuid": "2a0eed02-9430-4d68-901f-c0d4c1c3bf22",&lt;br&gt;
            "username": "janesmith",&lt;br&gt;
            "password": "jsonplaceholder.org",&lt;br&gt;
            "md5": "c1328472c5794a25723600f71c1b4586",&lt;br&gt;
            "sha1": "35544a31cc19bd6520af116554873167117f4d94",&lt;br&gt;
            "registered": "2022-06-10T12:45:20.022Z"&lt;br&gt;
        },&lt;br&gt;
        "address": {&lt;br&gt;
            "street": "456 Oak Street",&lt;br&gt;
            "suite": "Suite 200",&lt;br&gt;
            "city": "Anytown",&lt;br&gt;
            "zipcode": "12345-6789",&lt;br&gt;
            "geo": {&lt;br&gt;
                "lat": "42.3456",&lt;br&gt;
                "lng": "-71.6789"&lt;br&gt;
            }&lt;br&gt;
        },&lt;br&gt;
        "phone": "(555) 555-5678",&lt;br&gt;
        "website": "www.janesmith.com",&lt;br&gt;
        "company": {&lt;br&gt;
            "name": "XYZ Corporation",&lt;br&gt;
            "catchPhrase": "Leading the way in innovation",&lt;br&gt;
            "bs": "Finance"&lt;br&gt;
        }&lt;br&gt;
    }&lt;br&gt;
]&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Day 2, I will be discussing authentication in APIs,&lt;/strong&gt; which is an essential aspect of securing access and ensuring that only authorized users can interact with the API. Stay tuned!&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
    </item>
    <item>
      <title>Day 0: Introduction to Backend Development - Setting the Foundation</title>
      <dc:creator>Bakare Muideen Adeleke</dc:creator>
      <pubDate>Mon, 19 Aug 2024 21:54:46 +0000</pubDate>
      <link>https://forem.com/adeleke123/day-0-introduction-to-backend-development-setting-the-foundation-gcb</link>
      <guid>https://forem.com/adeleke123/day-0-introduction-to-backend-development-setting-the-foundation-gcb</guid>
      <description>&lt;p&gt;Welcome to Day 0 of my #100DaysOfMiva challenge! Today, I'm diving into the world of backend development, starting with a foundational understanding of what backend development is and how it fits into the broader scope of web development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Backend Development?&lt;/strong&gt;&lt;br&gt;
In web development, there are two main parts: frontend and backend. The frontend is the part of a website or web application that users interact with, the visuals, buttons, text and layout. It's like the friendly face of a &lt;strong&gt;cute puppy&lt;/strong&gt;. The backend, on the other hand, is the complex and powerful engine that drives the whole application, it's the &lt;strong&gt;beast&lt;/strong&gt; that handles the logic, processes data and ensures everything runs smoothly behind the scenes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4kqp8z04fk0t7rguw0f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4kqp8z04fk0t7rguw0f.png" alt="Image description" width="372" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you visit a website like YouTube, everything you see is the frontend. But behind the scenes, the backend is working tirelessly to handle complex tasks like video streaming, user authentication and data processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend vs. Backend&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Frontend: The part of the application that users see and interact with, typically built using HTML, CSS and JavaScript.&lt;/p&gt;

&lt;p&gt;Backend: The part of the application that users don't see, where all the magic happens, involving servers, databases and APIs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fou0j8y1p3j2j4biqvchz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fou0j8y1p3j2j4biqvchz.png" alt="Image description" width="641" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding Backend Technologies&lt;/strong&gt;&lt;br&gt;
Backend development involves working with various technologies and languages that power the server-side of web applications. Some popular backend languages include Node.js, Python, Go and PHP. Today, we will focus on Node.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing Node.js&lt;/strong&gt;&lt;br&gt;
To get started with Node.js, we will need to install it on our system. The best way to do this is by using &lt;a href="https://nodejs.org/en/download/package-manager" rel="noopener noreferrer"&gt;Node Version Manager (NVM)&lt;/a&gt;, which allows us to manage multiple versions of Node.js on the same machine.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install NVM:&lt;/strong&gt; Search for &lt;em&gt;Node Version Manager install&lt;/em&gt; to find the official installation guide for your operating system (Windows, macOS, Linux). Follow the instructions to install NVM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install Node.js:&lt;/strong&gt; Once NVM is installed, you can install the latest version of Node.js by running the command:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;nvm install latest&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Or, if you need a specific version:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nvm install v16.14.0&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Switch Between Versions:&lt;/strong&gt; You can switch between installed versions using:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;nvm use v16.14.0&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How the Internet Works From Browser to Server to Database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When we type a URL into our browser, a fascinating series of events takes place:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Browser Request:&lt;/strong&gt; Our browser sends a request to the server. For example, when we visit google.com, our browser requests the index.html file from Google's server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Server Processing:&lt;/strong&gt; The server receives the request and processes it. The server is like a translator, it understands the language of the backend which is &lt;em&gt;Node.js&lt;/em&gt; and knows how to handle the request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database Interaction:&lt;/strong&gt; If the request requires data (like fetching your YouTube video recommendations), the server interacts with the database. The database stores all the data, like user information, videos and comments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;API Calls:&lt;/strong&gt; To communicate between the browser, server and database, the backend uses APIs (Application Programming Interfaces). An API acts like a bridge, enabling different parts of the application to talk to each other.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Response to Browser:&lt;/strong&gt; After processing the request, the server sends the required files (like &lt;strong&gt;index.html&lt;/strong&gt; and other assets) back to the browser, which then renders the page we see.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Understanding APIs&lt;/strong&gt;&lt;br&gt;
APIs are the language of the internet, allowing different systems to communicate. For example, when you request a webpage, the server uses an API call to retrieve the necessary data from the database and send it back to the browser.&lt;/p&gt;

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

&lt;p&gt;Tomorrow, we will explore APIs in more detail, diving into how they work, their importance in backend development and practical examples of API calls.&lt;/p&gt;

&lt;p&gt;Stay tuned for &lt;strong&gt;Day 1 of the #100DaysOfMiva challenge&lt;/strong&gt;, where we will build on today's foundation and start coding our first APIs!&lt;/p&gt;

</description>
      <category>startingbackenddevelopment</category>
      <category>journeytobackend</category>
      <category>100daysofmiva</category>
    </item>
  </channel>
</rss>
