<?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: Tanvir Mulla</title>
    <description>The latest articles on Forem by Tanvir Mulla (@tanvirmulla11).</description>
    <link>https://forem.com/tanvirmulla11</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%2F3333722%2Ff01d7e96-f8f6-409b-9a8b-533df0efa4f0.png</url>
      <title>Forem: Tanvir Mulla</title>
      <link>https://forem.com/tanvirmulla11</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tanvirmulla11"/>
    <language>en</language>
    <item>
      <title>💡Open Source, Open Mind: My Hacktoberfest 2025 Reflection as a First-Time Contributor</title>
      <dc:creator>Tanvir Mulla</dc:creator>
      <pubDate>Fri, 31 Oct 2025 12:35:45 +0000</pubDate>
      <link>https://forem.com/tanvirmulla11/open-source-open-mind-my-hacktoberfest-2025-reflection-as-a-first-time-contributor-5446</link>
      <guid>https://forem.com/tanvirmulla11/open-source-open-mind-my-hacktoberfest-2025-reflection-as-a-first-time-contributor-5446</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest2025"&gt;2025 Hacktoberfest Writing Challenge&lt;/a&gt;: Open Source Reflections.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 Beginning the Journey: My First Step into Open Source
&lt;/h2&gt;

&lt;p&gt;This October marked my very first &lt;strong&gt;Hacktoberfest&lt;/strong&gt;, and it was more than just a coding event —&lt;br&gt;&lt;br&gt;
it was a door into a world where collaboration, communication, and curiosity define real development.&lt;/p&gt;

&lt;p&gt;As a &lt;strong&gt;first-time contributor&lt;/strong&gt;, I started with hesitation.&lt;br&gt;&lt;br&gt;
Would my code be good enough? Would maintainers even respond?&lt;br&gt;&lt;br&gt;
But once I submitted my first pull request, I realized — it’s not about perfection; it’s about participation.&lt;br&gt;&lt;br&gt;
That single step changed my mindset completely.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Why I Chose to Participate
&lt;/h2&gt;

&lt;p&gt;I’ve always admired open source from a distance — libraries, tools, and frameworks that power the world.&lt;br&gt;&lt;br&gt;
Hacktoberfest gave me the perfect excuse to finally give back.  &lt;/p&gt;

&lt;p&gt;I didn’t aim for a specific repository or fancy project.&lt;br&gt;&lt;br&gt;
Instead, I focused on &lt;strong&gt;understanding how real-world collaboration works&lt;/strong&gt; — reading issues, understanding structure, and contributing wherever I could add value.&lt;/p&gt;

&lt;p&gt;Each contribution, no matter how small, made me feel like I was part of something global.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ What I Worked On
&lt;/h2&gt;

&lt;p&gt;Throughout the month, I explored multiple projects spanning &lt;strong&gt;frontend fixes, DevOps scripts&lt;/strong&gt;, and &lt;strong&gt;documentation improvements&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Some were tiny PRs that corrected typos or added comments. Others involved understanding how CI/CD pipelines and Docker configurations were managed in open repositories.&lt;/p&gt;

&lt;p&gt;These tasks taught me that &lt;strong&gt;every contribution matters&lt;/strong&gt; — whether it’s code, docs, or testing feedback.&lt;br&gt;&lt;br&gt;
Every commit is a building block that strengthens the open-source community.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Lessons Learned Along the Way
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Collaboration Over Competition
&lt;/h3&gt;

&lt;p&gt;Hacktoberfest reminded me that open source isn’t a race.&lt;br&gt;&lt;br&gt;
It’s a collective effort where beginners and experts work side-by-side to make something better.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Documentation Is the Hidden Hero
&lt;/h3&gt;

&lt;p&gt;I realized that well-written documentation can save hours for new contributors.&lt;br&gt;&lt;br&gt;
In fact, my best contributions came from improving README files and explaining workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Mistakes Are Stepping Stones
&lt;/h3&gt;

&lt;p&gt;I made my fair share of errors — broken commits, unclear comments, and even rejected PRs.&lt;br&gt;&lt;br&gt;
But each mistake was followed by patient feedback from maintainers who helped me improve.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 How My Perspective Changed
&lt;/h2&gt;

&lt;p&gt;Before Hacktoberfest:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I need to master everything before contributing.”  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After Hacktoberfest:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Learning happens when you contribute.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s the biggest transformation — understanding that &lt;strong&gt;open source is a classroom where everyone teaches and learns&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It’s not about who knows more; it’s about who’s willing to share and grow together.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Advice for Future Participants
&lt;/h2&gt;

&lt;p&gt;If you’re thinking about joining Hacktoberfest next year, here’s what I’d tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start small.&lt;/strong&gt; Fix typos, update docs, or improve formatting — it counts!
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask questions.&lt;/strong&gt; Maintainers appreciate curiosity more than silence.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don’t chase stars; chase learning.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Be kind.&lt;/strong&gt; A thank-you comment or review can make someone’s day.
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Celebrate progress, not just pull requests.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌈 Looking Ahead
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest 2025 was just the start for me.&lt;br&gt;&lt;br&gt;
Now, open source feels less like a community I admire — and more like one I belong to.  &lt;/p&gt;

&lt;p&gt;I’ll keep contributing beyond October, exploring DevOps, cloud projects, and documentation initiatives.&lt;br&gt;&lt;br&gt;
Because the real reward isn’t a T-shirt or badge — it’s &lt;strong&gt;the growth that comes from giving back&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  👨‍💻 Author
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tanvir Mulla&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
DevOps Enthusiast | AWS Learner | Open Source Contributor&lt;br&gt;&lt;br&gt;
💼 GitHub: &lt;a href="https://github.com/tanvirmulla11" rel="noopener noreferrer"&gt;@tanvirmulla11&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💬 DEV: &lt;a href="https://dev.to/tanvirmulla"&gt;@tanvirmulla&lt;/a&gt;  &lt;/p&gt;




&lt;p&gt;⭐ &lt;em&gt;Hacktoberfest taught me one timeless truth — open source doesn’t just build software; it builds people.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🌱 My First Hacktoberfest: How Open Source Changed the Way I See Code</title>
      <dc:creator>Tanvir Mulla</dc:creator>
      <pubDate>Fri, 31 Oct 2025 12:24:28 +0000</pubDate>
      <link>https://forem.com/tanvirmulla11/my-first-hacktoberfest-how-open-source-changed-the-way-i-see-code-45p6</link>
      <guid>https://forem.com/tanvirmulla11/my-first-hacktoberfest-how-open-source-changed-the-way-i-see-code-45p6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest2025"&gt;2025 Hacktoberfest Writing Challenge&lt;/a&gt;: Contribution Chronicles.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎉 My First Step into the Open Source Universe
&lt;/h2&gt;

&lt;p&gt;This October, I did something I’d been planning for years —&lt;br&gt;&lt;br&gt;
I participated in &lt;strong&gt;Hacktoberfest 2025&lt;/strong&gt;, my &lt;em&gt;first ever open-source event&lt;/em&gt;. 🌍&lt;/p&gt;

&lt;p&gt;I didn’t know what to expect. I just knew one thing —&lt;br&gt;&lt;br&gt;
it was time to &lt;strong&gt;stop being a spectator&lt;/strong&gt; and start being a &lt;strong&gt;contributor&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Before It All Began
&lt;/h2&gt;

&lt;p&gt;Before Hacktoberfest, I had only worked on personal projects and tutorials.&lt;br&gt;&lt;br&gt;
I’d seen open-source repos with hundreds of contributors, and I always thought:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“That’s for pros — not for someone like me.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But this year, I wanted to prove myself wrong.&lt;br&gt;&lt;br&gt;
So I made a simple rule:&lt;br&gt;&lt;br&gt;
👉 &lt;strong&gt;Don’t aim to be perfect. Aim to participate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that mindset changed everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  🪶 My Hacktoberfest Badge Moment 🎖️
&lt;/h2&gt;

&lt;p&gt;Here’s my proudest digital moment — the badge that marks the start of something bigger.  &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%2F08at6aeciukard1hksry.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%2F08at6aeciukard1hksry.png" alt="Hacktoberfest 2025 Badges" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s not just a badge — it’s a reminder that I &lt;em&gt;can&lt;/em&gt; contribute to something global, real, and impactful.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 The Real Challenge: Understanding the “Why” of Code
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest taught me something that tutorials never did:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Code isn’t just about logic — it’s about people.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each pull request I made wasn’t just a line of code —&lt;br&gt;&lt;br&gt;
it was a conversation with maintainers, designers, and other contributors.&lt;br&gt;&lt;br&gt;
It made me ask questions like:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why was this function written this way?
&lt;/li&gt;
&lt;li&gt;How can this README help a future contributor?
&lt;/li&gt;
&lt;li&gt;Can I make this code a little clearer, even if I didn’t write it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That mindset shift — from &lt;em&gt;“How it works”&lt;/em&gt; to &lt;em&gt;“Why it exists”&lt;/em&gt; —&lt;br&gt;&lt;br&gt;
was my biggest win.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ My Technical Growth
&lt;/h2&gt;

&lt;p&gt;Even though I didn’t focus on one project, I explored many areas across DevOps and frontend repositories.&lt;br&gt;&lt;br&gt;
Here’s what I built up along the way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learned to &lt;strong&gt;read other people’s code efficiently&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Improved my &lt;strong&gt;Git and GitHub workflow&lt;/strong&gt; (branching, rebasing, PR hygiene)
&lt;/li&gt;
&lt;li&gt;Understood how &lt;strong&gt;CI/CD pipelines&lt;/strong&gt; keep large projects stable
&lt;/li&gt;
&lt;li&gt;Practiced &lt;strong&gt;Docker image optimization&lt;/strong&gt; and &lt;strong&gt;code documentation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Explored &lt;strong&gt;issues triaging&lt;/strong&gt; — helping others understand, label, or debug problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These skills weren’t from one tutorial — they came from real collaboration.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 What Surprised Me Most
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentation is a Superpower.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Writing clear, human-friendly docs is sometimes more valuable than code.&lt;br&gt;&lt;br&gt;
It connects contributors faster than any commit ever could.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maintainers are mentors.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Many maintainers gave me patient, detailed feedback that made me rethink my approach to commits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open Source isn’t a competition — it’s collaboration.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The energy of people improving each other’s work for free is something you have to experience to believe.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚧 Mistakes That Taught Me More Than Success
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I pushed a broken commit once. Instead of panic, I learned to &lt;strong&gt;revert gracefully&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;I misunderstood a code comment and realized the importance of &lt;strong&gt;communication before contribution&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;I got my PR rejected — and it turned into a learning session about &lt;em&gt;readability vs. optimization&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each small “failure” became a micro-lesson that no YouTube tutorial could teach.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 My Takeaway: Contribution &amp;gt; Perfection
&lt;/h2&gt;

&lt;p&gt;When you contribute to open source, nobody expects you to be perfect.&lt;br&gt;&lt;br&gt;
They expect you to &lt;strong&gt;show up&lt;/strong&gt;, &lt;strong&gt;communicate&lt;/strong&gt;, and &lt;strong&gt;care&lt;/strong&gt; about what you’re building.&lt;/p&gt;

&lt;p&gt;And that’s what Hacktoberfest truly is — not just a challenge,&lt;br&gt;&lt;br&gt;
but a reminder that &lt;strong&gt;every developer has something valuable to give&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌈 A New Perspective
&lt;/h2&gt;

&lt;p&gt;Before Hacktoberfest:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’m learning to code.”  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After Hacktoberfest:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’m helping the community grow.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s a big mindset upgrade — and it’s the one I’m carrying forward into every project now.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ My Advice for Future First-Timers
&lt;/h2&gt;

&lt;p&gt;If you’re planning to join next year:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with &lt;strong&gt;good first issues&lt;/strong&gt; — they’re gold for beginners.
&lt;/li&gt;
&lt;li&gt;Don’t chase fancy repos; pick something you &lt;strong&gt;understand and enjoy&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Read the README. Twice.
&lt;/li&gt;
&lt;li&gt;Talk to maintainers — they’re nicer than you think.
&lt;/li&gt;
&lt;li&gt;And yes, celebrate &lt;em&gt;every small contribution&lt;/em&gt;. 💪&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Final Reflection
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest didn’t just give me a badge.&lt;br&gt;&lt;br&gt;
It gave me &lt;strong&gt;confidence, clarity, and connection&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It reminded me why we all started coding in the first place —&lt;br&gt;&lt;br&gt;
to create, to share, and to make something that outlives us.&lt;/p&gt;




&lt;h2&gt;
  
  
  👨‍💻 Author
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tanvir Mulla&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
DevOps Enthusiast | AWS Learner | Open Source Explorer&lt;br&gt;&lt;br&gt;
💼 GitHub: &lt;a href="https://github.com/tanvirmulla11" rel="noopener noreferrer"&gt;@tanvirmulla11&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💬 DEV: &lt;a href="https://dev.to/tanvirmulla"&gt;@tanvirmulla&lt;/a&gt;  &lt;/p&gt;




&lt;p&gt;⭐ &lt;em&gt;Thanks for reading! See you in Hacktoberfest 2026 — with even bigger pull requests and smaller fears.&lt;/em&gt;  &lt;/p&gt;

&lt;h1&gt;
  
  
  Hacktoberfest
&lt;/h1&gt;

</description>
      <category>hacktoberfest2025</category>
      <category>opensource</category>
      <category>devops</category>
      <category>codingjourney</category>
    </item>
    <item>
      <title>🚀 Zero-Downtime Deployments with Jenkins, Docker &amp; Hostinger VPS (Gradle + React + MySQL)</title>
      <dc:creator>Tanvir Mulla</dc:creator>
      <pubDate>Tue, 09 Sep 2025 06:29:47 +0000</pubDate>
      <link>https://forem.com/tanvirmulla11/zero-downtime-deployments-with-jenkins-docker-hostinger-vps-gradle-react-mysql-24dg</link>
      <guid>https://forem.com/tanvirmulla11/zero-downtime-deployments-with-jenkins-docker-hostinger-vps-gradle-react-mysql-24dg</guid>
      <description>&lt;p&gt;Hackathons are fun, but stressful — especially when your site &lt;em&gt;must&lt;/em&gt; stay live until the judging ends.&lt;br&gt;
Here’s a complete &lt;strong&gt;copy-resistant, step-by-step deployment guide&lt;/strong&gt; you can drop into your repo and follow.&lt;/p&gt;

&lt;p&gt;It’s designed around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gradle backend&lt;/strong&gt; (Spring Boot)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React frontend&lt;/strong&gt; (Nginx)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL DB&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-stage Docker builds&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jenkins CI/CD&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hostinger VPS (Ubuntu)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blue/Green-style release strategy&lt;/strong&gt; (atomic swap + health-gated rollback)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, you’ll have a &lt;strong&gt;live, SSL-enabled site&lt;/strong&gt; with short downtime, safe rollback, and reproducible builds.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔑 What’s Unique in This Approach
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic image tags&lt;/strong&gt; → &lt;code&gt;YYYYmmddHHMM-&amp;lt;gitshort&amp;gt;&lt;/code&gt; (e.g., &lt;code&gt;202509041530-1a2b3c4&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atomic release swap&lt;/strong&gt; → Jenkins deploys to &lt;code&gt;/opt/chattingo/releases/&amp;lt;TAG&amp;gt;&lt;/code&gt;, then atomically swaps to &lt;code&gt;/opt/chattingo/current&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health-gated rollback&lt;/strong&gt; → If the new release fails &lt;code&gt;/actuator/health&lt;/code&gt; within 60s, rollback triggers automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache-busting frontend&lt;/strong&gt; → Docker build injects a unique &lt;code&gt;BUILD_ID&lt;/code&gt; into &lt;code&gt;index.html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal downtime&lt;/strong&gt; → Users never see a broken app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducible &amp;amp; transparent&lt;/strong&gt; → All scripts, configs, and Jenkinsfile are in the repo.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🛠️ Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting, fill in these placeholders with your values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;YOUR_DOCKERHUB_USER&lt;/code&gt; → DockerHub username&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;YOUR_DOMAIN&lt;/code&gt; → domain you own (for SSL)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;YOUR_VPS_IP&lt;/code&gt; → Hostinger VPS IP&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SSH_USER&lt;/code&gt; → VPS user (e.g., &lt;code&gt;ubuntu&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GIT_BRANCH&lt;/code&gt; → branch used for deployment (e.g., &lt;code&gt;devops-implementation&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;JENKINS_CRED_IDS&lt;/code&gt; → Jenkins credentials (&lt;code&gt;dockerhub-user/pass&lt;/code&gt;, &lt;code&gt;vps-ssh&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🏗️ Docker &amp;amp; Compose Setup
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Frontend Dockerfile
&lt;/h3&gt;

&lt;p&gt;Injects build ID for cache busting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:18-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; BUILD_ID&lt;/span&gt;
&lt;span class="k"&gt;RUN if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; public/index.html &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/__BUILD_ID__/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BUILD_ID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/g"&lt;/span&gt; public/index.html &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; nginx:stable-alpine&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build /app/build /usr/share/nginx/html&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; nginx.frontend.conf /etc/nginx/conf.d/default.conf&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["nginx", "-g", "daemon off;"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ Add &lt;code&gt;__BUILD_ID__&lt;/code&gt; in your &lt;code&gt;public/index.html&lt;/code&gt; to avoid stale caches.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Backend Dockerfile (Gradle multi-stage)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;gradle:8.3-jdk17&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; build.gradle settings.gradle ./ &lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; gradle ./gradle&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; src ./src&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;gradle clean build &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--no-daemon&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; eclipse-temurin:17-jre-jammy&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/build/libs/*.jar app.jar&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;
&lt;span class="k"&gt;HEALTHCHECK&lt;/span&gt;&lt;span class="s"&gt; --interval=15s --timeout=5s --start-period=10s --retries=5 \&lt;/span&gt;
  CMD curl -f http://localhost:8080/actuator/health || exit 1
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["java","-jar","/app/app.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ No need to install Gradle on Jenkins — build happens inside the container.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. docker-compose.yml (release template)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_ROOT_PASSWORD:-rootpass}&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_DATABASE:-chattingo}&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db_data:/var/lib/mysql&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;YOUR_DOCKERHUB_USER/chattingo-backend:PLACEHOLDER_TAG&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;SPRING_DATASOURCE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jdbc:mysql://db:3306/${MYSQL_DATABASE}&lt;/span&gt;
      &lt;span class="na"&gt;SPRING_DATASOURCE_USERNAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
      &lt;span class="na"&gt;SPRING_DATASOURCE_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_ROOT_PASSWORD}&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;YOUR_DOCKERHUB_USER/chattingo-frontend:PLACEHOLDER_TAG&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3001:80"&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ Jenkins replaces &lt;code&gt;PLACEHOLDER_TAG&lt;/code&gt; with your unique &lt;code&gt;$TAG&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Jenkins Pipeline (CI/CD)
&lt;/h2&gt;

&lt;p&gt;Your &lt;code&gt;Jenkinsfile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;
  &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;IMAGE_PREFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"YOUR_DOCKERHUB_USER"&lt;/span&gt;
    &lt;span class="n"&gt;VPS_SSH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"vps-ssh"&lt;/span&gt;
    &lt;span class="n"&gt;BRANCH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"GIT_BRANCH"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;stages&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Checkout'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;checkout&lt;/span&gt; &lt;span class="n"&gt;scm&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Set TAG'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TAG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nl"&gt;script:&lt;/span&gt; &lt;span class="s2"&gt;"echo $(date +%Y%m%d%H%M)-$(git rev-parse --short HEAD)"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
            &lt;span class="nl"&gt;returnStdout:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;trim&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Build Frontend Image'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"docker build --build-arg BUILD_ID=${TAG} -t ${IMAGE_PREFIX}/chattingo-frontend:${TAG} ./frontend"&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Build Backend Image'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"docker build -t ${IMAGE_PREFIX}/chattingo-backend:${TAG} ./backend"&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Push Images'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;withCredentials&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="n"&gt;usernamePassword&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;credentialsId:&lt;/span&gt; &lt;span class="s1"&gt;'dockerhub-creds'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;usernameVariable:&lt;/span&gt; &lt;span class="s1"&gt;'USER'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;passwordVariable:&lt;/span&gt; &lt;span class="s1"&gt;'PASS'&lt;/span&gt;&lt;span class="o"&gt;)])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'''
            echo $PASS | docker login -u $USER --password-stdin
            docker push ${IMAGE_PREFIX}/chattingo-frontend:${TAG}
            docker push ${IMAGE_PREFIX}/chattingo-backend:${TAG}
          '''&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Deploy to VPS'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;sshagent&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;credentials:&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VPS_SSH&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'''
            scp docker-compose.yml ${SSH_USER}@${YOUR_VPS_IP}:/opt/chattingo/releases/${TAG}/docker-compose.yml
            ssh ${SSH_USER}@${YOUR_VPS_IP} "sudo /usr/local/bin/deploy_release.sh ${TAG}"
          '''&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🟢 Atomic Deployment Script (on VPS)
&lt;/h2&gt;

&lt;p&gt;Save as &lt;code&gt;/usr/local/bin/deploy_release.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail
&lt;span class="nv"&gt;TAG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;RELEASE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/opt/chattingo/releases/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TAG&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;CURRENT_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/opt/chattingo/current"&lt;/span&gt;
&lt;span class="nv"&gt;PREV_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/opt/chattingo/previous"&lt;/span&gt;
&lt;span class="nv"&gt;TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;60
&lt;span class="nv"&gt;HEALTH_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://YOUR_DOMAIN/actuator/health"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RELEASE_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Swap logic&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CURRENT_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CURRENT_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PREV_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RELEASE_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CURRENT_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CURRENT_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--remove-orphans&lt;/span&gt;

&lt;span class="c"&gt;# Health gating&lt;/span&gt;
&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
&lt;span class="k"&gt;until &lt;/span&gt;curl &lt;span class="nt"&gt;-fsS&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HEALTH_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;sleep &lt;/span&gt;5
  &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$SECONDS&lt;/span&gt; &lt;span class="nt"&gt;-ge&lt;/span&gt; &lt;span class="nv"&gt;$TIMEOUT&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    docker compose down &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PREV_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PREV_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CURRENT_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CURRENT_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;3
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;done

&lt;/span&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PREV_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ This ensures &lt;strong&gt;instant rollback&lt;/strong&gt; if your site fails health checks.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Nginx Reverse Proxy
&lt;/h2&gt;

&lt;p&gt;Place at &lt;code&gt;/etc/nginx/sites-available/chattingo&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;YOUR_DOMAIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;YOUR_DOMAIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/YOUR_DOMAIN/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/YOUR_DOMAIN/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:3001/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/api/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:8080/api/&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;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/chattingo /etc/nginx/sites-enabled/
&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ images:
&lt;/h2&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%2Fnvdkjx6sgtui4o1xr8w7.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%2Fnvdkjx6sgtui4o1xr8w7.png" alt="Tital" width="800" height="418"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxw320k3ktokeyy651he2.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%2Fxw320k3ktokeyy651he2.png" alt="Pipeline" width="800" height="137"&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%2Fyuc1galk5zr6g9t9we7p.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%2Fyuc1galk5zr6g9t9we7p.png" alt="Output" width="800" height="651"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&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%2Fqtyqy251wpot92fblwx5.png" alt="Output" width="800" height="428"&gt;
&lt;/h2&gt;

&lt;p&gt;✨ Thanks for reading! If this guide helped you,&lt;br&gt;
👉 Like ❤️ the post to support my work&lt;br&gt;
👉 Comment 💬 your thoughts, questions, or improvements&lt;br&gt;
👉 Share 🔗 with friends or teammates working on CI/CD or hackathon projects&lt;/p&gt;

&lt;p&gt;Let’s keep building and learning together 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🎨 CSS Art: Office Culture – Dev Desk Vibes</title>
      <dc:creator>Tanvir Mulla</dc:creator>
      <pubDate>Wed, 16 Jul 2025 01:37:08 +0000</pubDate>
      <link>https://forem.com/tanvirmulla11/css-art-office-culture-dev-desk-vibes-238o</link>
      <guid>https://forem.com/tanvirmulla11/css-art-office-culture-dev-desk-vibes-238o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, CSS Art: Office Culture&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Inspiration
&lt;/h2&gt;

&lt;p&gt;What does office culture mean to a developer?&lt;br&gt;&lt;br&gt;
For me — it's dual monitors, an RGB keyboard, coffee on the side, and a terminal searching Stack Overflow at 7 AM 😅.&lt;br&gt;&lt;br&gt;
This CSS art represents that exact mood — a developer's peaceful (and chaotic) workspace before the daily standup.&lt;/p&gt;




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

&lt;p&gt;🔗 &lt;strong&gt;Live Site:&lt;/strong&gt; &lt;a href="https://developerdesk.netlify.app/" rel="noopener noreferrer"&gt;https://developerdesk.netlify.app/&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%2Ffa17c69tv3o8jxr9cqvu.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%2Ffa17c69tv3o8jxr9cqvu.png" alt="Dark Mode" width="800" height="471"&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%2F5zchxc4z1tep8id19327.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%2F5zchxc4z1tep8id19327.png" alt="Light Mode" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Journey
&lt;/h2&gt;

&lt;p&gt;This project was created using &lt;strong&gt;pure HTML and CSS&lt;/strong&gt; — no JavaScript, no images.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Dual monitors: one for coding, one for task management
&lt;/li&gt;
&lt;li&gt;Glow-effect mechanical keyboard
&lt;/li&gt;
&lt;li&gt;Reminders section: standup, bugs, deploy &amp;amp; lunch — the usual!
&lt;/li&gt;
&lt;li&gt;Coffee mug (non-negotiable ☕)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I learned:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Using CSS &lt;code&gt;flex&lt;/code&gt; and &lt;code&gt;grid&lt;/code&gt; for structured, layered designs&lt;/li&gt;
&lt;li&gt;Creating glowing elements with box-shadow and transitions&lt;/li&gt;
&lt;li&gt;Designing in “developer reality” rather than just aesthetics&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What's next?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Make it interactive using CSS variables or checkbox toggles&lt;/li&gt;
&lt;li&gt;Add a dark/light mode switch entirely in CSS&lt;/li&gt;
&lt;li&gt;Maybe even animate the coffee steam ☁️&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Tech Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HTML5
&lt;/li&gt;
&lt;li&gt;CSS3 (Flexbox, Grid, Animations)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  👨‍💻 Author
&lt;/h2&gt;

&lt;p&gt;Made with ❤️ by &lt;a href="https://github.com/tanvirmulla11" rel="noopener noreferrer"&gt;Tanvir Mulla&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🏷️ Tags
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;#CSSArt&lt;/code&gt; &lt;code&gt;#FrontendChallenge&lt;/code&gt; &lt;code&gt;#DevLife&lt;/code&gt; &lt;code&gt;#PureCSS&lt;/code&gt; &lt;code&gt;#OfficeCulture&lt;/code&gt; &lt;code&gt;#DeveloperDesk&lt;/code&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Thanks for checking it out! 😊&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
    </item>
    <item>
      <title>DreamMix 🌙🧠 — Generate Surreal Dreamscapes with Gemini + Imagen</title>
      <dc:creator>Tanvir Mulla</dc:creator>
      <pubDate>Fri, 11 Jul 2025 01:38:28 +0000</pubDate>
      <link>https://forem.com/tanvirmulla11/dreammix-generate-surreal-dreamscapes-with-gemini-imagen-16nd</link>
      <guid>https://forem.com/tanvirmulla11/dreammix-generate-surreal-dreamscapes-with-gemini-imagen-16nd</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is my submission for &lt;a href="https://dev.to/deved/build-apps-with-google-ai-studio"&gt;DEV Education Track: Build Apps with Google AI Studio&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;✨ DreamMix&lt;/strong&gt; is a calming, creative bedtime app that generates &lt;strong&gt;personalized dreamscapes&lt;/strong&gt; using the power of AI.&lt;/p&gt;

&lt;p&gt;Before you sleep, you enter 2–3 imaginative keywords, and DreamMix instantly creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎨 A &lt;strong&gt;surreal visual dream scene&lt;/strong&gt; using &lt;strong&gt;Imagen&lt;/strong&gt; (Google’s image generation model)&lt;/li&gt;
&lt;li&gt;📖 A &lt;strong&gt;peaceful narrative&lt;/strong&gt; written by &lt;strong&gt;Gemini&lt;/strong&gt;, like a bedtime story composed just for you&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔮 Sample Interaction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;User Input:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;["floating island", "dragonfruit sky", "childhood home"]&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🧠 Gemini-Generated Narrative:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Tonight, you will dream of a floating island adrift in a sky the color of ripe dragonfruit. The air hums with memory as you walk barefoot through cloudgrass toward your childhood home, glowing softly atop the cliffs. Lanterns float beside you, whispering stories only dreams can tell. Somewhere, a gentle breeze carries laughter from a time long past. Sleep, dear dreamer—the island will wait for you until morning.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;🖼️ Imagen Dream Visual Prompt:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A whimsical floating island in the sky with soft neon clouds, glowing lanterns, and a cozy childhood home perched at the center. The sky is vibrant magenta and orange like dragonfruit, and the entire scene sparkles with surreal, peaceful energy. Gentle mist surrounds the island with light shimmer effects.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🔗 &lt;a href="https://github.com/tanvirmulla11/Apps-with-Google-AI-Studio.git" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📸 Photos
&lt;/h2&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%2F2fg7auy2ngqpccb5i5tc.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%2F2fg7auy2ngqpccb5i5tc.png" alt="pic-1" width="800" height="398"&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%2Ft1puydkdxlosn3qfu00j.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%2Ft1puydkdxlosn3qfu00j.png" alt="pic-2" width="800" height="421"&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%2F4vveyl806ev6j8okyn75.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%2F4vveyl806ev6j8okyn75.png" alt="pic-3" width="800" height="457"&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%2Ftfl58djwu9bn42enfxwc.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%2Ftfl58djwu9bn42enfxwc.png" alt="pic-4" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&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%2F2g0ouxvfz3ah2ua6045m.png" alt="pic-5" width="800" height="482"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  🔧 How It Works
&lt;/h2&gt;

&lt;p&gt;DreamMix combines two powerful tools from &lt;strong&gt;Google AI Studio&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🧠 &lt;strong&gt;Gemini (text generation)&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Writes a peaceful, imaginative dream narrative using themes from the user’s input.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🖼️ &lt;strong&gt;Imagen (image generation)&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Takes a visual scene description (also generated by Gemini) and renders it into dreamy art.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧭 My Experience
&lt;/h2&gt;

&lt;p&gt;This was one of the most enjoyable creative AI projects I've ever worked on. Here's what I discovered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧩 &lt;strong&gt;Gemini is incredibly flexible&lt;/strong&gt; — It was able to merge even unrelated dream elements into poetic prose.&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;Imagen does well with surreal prompts&lt;/strong&gt; when you focus on &lt;strong&gt;lighting, color palette, and composition&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;This challenge encouraged me to think&lt;/strong&gt; about how AI can support &lt;strong&gt;mental health and mindfulness&lt;/strong&gt;, not just productivity.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Why This Project Matters
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DreamMix&lt;/strong&gt; isn't just about AI for fun — it's about &lt;strong&gt;AI for peace&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
In a noisy world, taking a moment to slow down and visualize a beautiful place — real or imagined — can help us fall asleep calmer, happier, and inspired.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google AI Studio&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini + Imagen&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML/CSS frontend&lt;/strong&gt; (optionally deploy via &lt;a href="https://replit.com" rel="noopener noreferrer"&gt;Replit&lt;/a&gt; or &lt;a href="https://netlify.com" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  👏 Shoutout
&lt;/h2&gt;

&lt;p&gt;Thanks to &lt;strong&gt;Google&lt;/strong&gt;, &lt;strong&gt;DEV&lt;/strong&gt;, and the &lt;strong&gt;Google AI Studio&lt;/strong&gt; team for providing this platform and challenge. The creative possibilities are limitless.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Sleep well, dreamer.&lt;/strong&gt; 🌙✨&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Key Prompt Used in Gemini
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
plaintext
You are a creative AI that helps users design magical and surreal dream experiences before bedtime. The user provides a short set of imaginative or nostalgic elements they would like to see in their dream. Your role is to transform these elements into:

1. A soothing, poetic bedtime narrative (200–300 words), starting with “Tonight, you will dream of…”. This narrative should:
   - Be calm and comforting
   - Use vivid, whimsical metaphors
   - Blend the elements into a cohesive story
   - Inspire peaceful imagination before sleep
   - End with a soft closing line like “Sleep well, dreamer.”

2. A visual dream scene description that will be sent to an image-generation model (Imagen). This visual should:
   - Combine the user’s elements into a dreamlike setting
   - Avoid realism; embrace surrealism, fantasy, and imagination
   - Use atmospheric details like fog, stars, neon skies, levitating objects, glowing landscapes
   - Mention composition, color palette, lighting, and mood
   - Be around 3–5 sentences long

**Example Input:**
["floating island", "dragonfruit sky", "childhood home"]

**Output:**


---

💭 Let me know in the comments:

🌀 What would your dream look like if you could design it?



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

&lt;/div&gt;

</description>
      <category>deved</category>
      <category>ai</category>
      <category>gemini</category>
      <category>googleaistudio</category>
    </item>
    <item>
      <title>🚀 404ffice: The Time-Traveling Intranet</title>
      <dc:creator>Tanvir Mulla</dc:creator>
      <pubDate>Thu, 10 Jul 2025 01:35:54 +0000</pubDate>
      <link>https://forem.com/tanvirmulla11/404ffice-the-time-traveling-intranet-reimagining-office-culture-through-the-decades-28da</link>
      <guid>https://forem.com/tanvirmulla11/404ffice-the-time-traveling-intranet-reimagining-office-culture-through-the-decades-28da</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, Holistic Webdev: Office Space&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;404ffice&lt;/strong&gt; is a time-traveling intranet that lets you explore what internal digital workspaces might have looked like — or &lt;em&gt;will&lt;/em&gt; look like — in different decades.&lt;/p&gt;

&lt;p&gt;Each section of the site represents an office intranet from a particular era:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1980s:&lt;/strong&gt; Neon grids, pixel fonts, and a typing speed challenge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1990s:&lt;/strong&gt; Windows 95-style desktop with draggable icons&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2000s:&lt;/strong&gt; Flash-inspired themes, quizzes, and a retro palette&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2020s:&lt;/strong&gt; Zoom fatigue bingo, self-care reminders, and productivity charts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2035s:&lt;/strong&gt; Holographic dashboards, neural widgets, and AI bots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🎧 &lt;strong&gt;Key Feature&lt;/strong&gt;: As you move between decades using the &lt;strong&gt;Time Slider&lt;/strong&gt;, each era loads a new &lt;strong&gt;background soundscape&lt;/strong&gt; using &lt;code&gt;Tone.js&lt;/code&gt;. This immersive audio transports you to that office era — from humming CRT monitors to ambient AI sounds of the future.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The goal: merge design nostalgia with modern web tech to create a fun, interactive, and &lt;em&gt;surprisingly useful&lt;/em&gt; fake intranet!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frek74d1or076ilhk1k93.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%2Frek74d1or076ilhk1k93.png" alt="1980s-style intranet with neon grid background, pixel fonts, and terminal UI" width="800" height="406"&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%2Fgv7jg3a9lv2on3g3sfk7.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%2Fgv7jg3a9lv2on3g3sfk7.png" alt="retro Windows-style desktop layout with draggable icons on an intranet homepage" width="800" height="425"&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%2Fls3dydov0fluz354sjol.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%2Fls3dydov0fluz354sjol.png" alt="intranet interface with quizzes and minimal blue-themed layout" width="800" height="518"&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%2F86c7yukwxsgiuuotd9ub.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%2F86c7yukwxsgiuuotd9ub.png" alt="intranet design featuring productivity dashboard and Zoom fatigue bingo" width="800" height="459"&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%2F5n01s6uwb96vx4rxmnhu.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%2F5n01s6uwb96vx4rxmnhu.png" alt="Futuristic 2035s intranet with holographic widgets, neural charts, and AI assistant" width="800" height="544"&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%2F1epvxjefxd1bfmbrkzrc.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%2F1epvxjefxd1bfmbrkzrc.png" alt="Time Slider component for switching between decades of intranet design" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;🔗 &lt;strong&gt;Live Site&lt;/strong&gt;: &lt;a href="https://404ffice.netlify.app/" rel="noopener noreferrer"&gt;https://404ffice.netlify.app/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
📦 &lt;strong&gt;GitHub Repo&lt;/strong&gt;: &lt;a&gt;https://github.com/tanvirmulla11/Frontend-Challenge&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Journey
&lt;/h2&gt;

&lt;p&gt;This project was a creative deep dive into three things I love:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎨 UI/UX design&lt;/li&gt;
&lt;li&gt;🎧 Audio interactivity&lt;/li&gt;
&lt;li&gt;⌛ Tech nostalgia&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Challenges I tackled:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Designing a consistent yet decade-specific component system&lt;/li&gt;
&lt;li&gt;Creating sound environments for each era using &lt;code&gt;Tone.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Building a flexible layout with &lt;strong&gt;TailwindCSS&lt;/strong&gt; that adapts with the themes&lt;/li&gt;
&lt;li&gt;Making the 1990s "desktop" draggable and fun like a mini OS&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I'm most proud of:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🧠 The &lt;strong&gt;OfficeBot AI&lt;/strong&gt;, whose personality changes by decade&lt;/li&gt;
&lt;li&gt;🎯 Typing speed challenge with live scoring&lt;/li&gt;
&lt;li&gt;📦 A &lt;strong&gt;Digital Time Capsule&lt;/strong&gt; where users write messages to their future selves&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  👏 Credits
&lt;/h2&gt;

&lt;p&gt;Created solo by &lt;strong&gt;&lt;a href="https://dev.to/tanvirmulla11"&gt;@tanvirmulla11&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Axero &amp;amp; DEV for this awesome prompt 🙌&lt;/li&gt;
&lt;li&gt;Tailwind, Tone.js, Lucide, and Google Fonts&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛡️ License
&lt;/h2&gt;

&lt;p&gt;MIT — you’re welcome to fork, remix, and expand the office through time.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Keep clicking, coding, and traveling through time.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>css</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
