<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Suliman Munawar khan</title>
    <description>The latest articles on DEV Community by Suliman Munawar khan (@sulimanmunawarkhan).</description>
    <link>https://dev.to/sulimanmunawarkhan</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%2F175430%2Fb74bf576-e82f-4847-ae31-af79f631e800.png</url>
      <title>DEV Community: Suliman Munawar khan</title>
      <link>https://dev.to/sulimanmunawarkhan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sulimanmunawarkhan"/>
    <language>en</language>
    <item>
      <title>How to Prevent Memory Leaks in Angular</title>
      <dc:creator>Suliman Munawar khan</dc:creator>
      <pubDate>Thu, 04 Sep 2025 08:17:34 +0000</pubDate>
      <link>https://dev.to/sulimanmunawarkhan/how-to-prevent-memory-leaks-in-angular-530</link>
      <guid>https://dev.to/sulimanmunawarkhan/how-to-prevent-memory-leaks-in-angular-530</guid>
      <description>&lt;p&gt;Memory leaks are one of the most common performance issues in Angular applications. They occur when your application holds references to resources that are no longer needed, preventing the JavaScript garbage collector from freeing up memory. Over time, memory leaks can slow down your app, increase load times, and cause crashes, especially in large or long-running applications.&lt;/p&gt;

&lt;p&gt;In this blog post, we will explore the main causes of memory leaks in Angular and share practical strategies to prevent them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understanding Memory Leaks in Angular
&lt;/h2&gt;

&lt;p&gt;A memory leak happens when memory that is no longer needed by the application is not released. In Angular, common sources include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unsubscribed Observables&lt;/li&gt;
&lt;li&gt;Detached DOM elements&lt;/li&gt;
&lt;li&gt;Timers or intervals left running&lt;/li&gt;
&lt;li&gt;Long-lived services holding unnecessary data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Memory leaks can be subtle and difficult to detect because your application might appear to work correctly at first. Tools like Chrome DevTools and Angular DevTools can help track memory usage over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Common Causes of Memory Leaks in Angular
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;a. Unsubscribed Observables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Angular applications rely heavily on RxJS Observables for handling asynchronous data, such as HTTP requests or user interactions. Failing to unsubscribe from Observables can prevent components from being garbage collected.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export class ExampleComponent implements OnInit, OnDestroy {
  dataSubscription!: Subscription;

  ngOnInit() {
    this.dataSubscription = this.dataService.getData().subscribe(data =&amp;gt; {
      console.log(data);
    });
  }

  ngOnDestroy() {
    this.dataSubscription.unsubscribe(); // Important!
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Best Practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use takeUntil with a Subject to handle multiple subscriptions.&lt;/li&gt;
&lt;li&gt;Use the async pipe in templates to automatically manage subscriptions.&lt;/li&gt;
&lt;li&gt;Avoid manual subscriptions if possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;b. Detached DOM Elements&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes Angular components remove DOM elements from the view but retain references to them in the component class or service. This prevents garbage collection.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private elementRef: HTMLElement;

ngOnInit() {
  this.elementRef = document.getElementById('some-element')!;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If elementRef is not cleared when the component is destroyed, the memory remains occupied.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Avoid storing raw DOM elements directly.&lt;/li&gt;
&lt;li&gt;Use Angular's Renderer2 or template references (@ViewChild) properly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clear references in ngOnDestroy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;c. Timers and Intervals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;JavaScript setInterval or setTimeout can keep running even after a component is destroyed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngOnInit() {
  this.intervalId = setInterval(() =&amp;gt; {
    console.log('Running...');
  }, 1000);
}

ngOnDestroy() {
  clearInterval(this.intervalId);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always clean up timers in the ngOnDestroy lifecycle hook.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;d. Long-Lived Services Holding Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Singleton services that hold references to large data arrays or objects can cause memory leaks if those references are never cleared.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Injectable({ providedIn: 'root' })
export class DataService {
  cachedData: any[] = [];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Clear or reset service data when it is no longer needed.&lt;/li&gt;
&lt;li&gt;Use lazy-loaded services instead of singleton services for data that is not globally required.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Tools to Detect Memory Leaks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chrome DevTools: Use the Memory tab to take heap snapshots and find detached nodes.&lt;/li&gt;
&lt;li&gt;Augury / Angular DevTools: Helps visualize component lifecycles and detect potential memory issues.&lt;/li&gt;
&lt;li&gt;RxJS Debugging Tools: Use operators like tap or finalize to track subscriptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Best Practices to Prevent Memory Leaks
&lt;/h2&gt;

&lt;p&gt;1- Use async Pipe: Automatically unsubscribes from Observables in templates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div *ngIf="data$ | async as data"&amp;gt;{{ data.name }}&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2- Use takeUntil for multiple subscriptions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private destroy$ = new Subject&amp;lt;void&amp;gt;();

ngOnInit() {
  this.dataService.getData()
    .pipe(takeUntil(this.destroy$))
    .subscribe(data =&amp;gt; console.log(data));
}

ngOnDestroy() {
  this.destroy$.next();
  this.destroy$.complete();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3- Avoid storing DOM references directly; prefer Angular template references or Renderer2. &lt;br&gt;
4- Clean up timers and intervals in ngOnDestroy.&lt;br&gt;
5- Be cautious with global services; reset data when not needed.&lt;br&gt;
6- Avoid circular references between components, services, or data structures.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Conclusion
&lt;/h2&gt;

&lt;p&gt;Memory leaks in Angular may seem harmless initially, but over time they can seriously degrade application performance. The key is to be proactive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unsubscribe from Observables&lt;/li&gt;
&lt;li&gt;Clear intervals and timers&lt;/li&gt;
&lt;li&gt;Avoid unnecessary references in services and components&lt;/li&gt;
&lt;li&gt;Regularly profile your app using memory tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By following these best practices, you can ensure your Angular applications remain fast, responsive, and free of memory issues.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>programming</category>
      <category>devtip</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🧠 Build Your Own Document Q&amp;A Assistant with GPT, Redis &amp; Docker</title>
      <dc:creator>Suliman Munawar khan</dc:creator>
      <pubDate>Sun, 27 Jul 2025 17:50:13 +0000</pubDate>
      <link>https://dev.to/sulimanmunawarkhan/build-your-own-document-qa-assistant-with-gpt-redis-docker-d9m</link>
      <guid>https://dev.to/sulimanmunawarkhan/build-your-own-document-qa-assistant-with-gpt-redis-docker-d9m</guid>
      <description>&lt;p&gt;Have you ever wanted to just ask questions about a document—whether it's a research paper, contract, or report—and get an AI-powered answer instantly? That’s exactly what I built: a Document Q&amp;amp;A Assistant that uses GPT-3.5, Redis with vector search, and Docker to make document understanding smarter and more interactive.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through the tech stack, what I’ve learned, how everything fits together, and where I plan to take it next.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Project Overview
&lt;/h2&gt;

&lt;p&gt;This is a backend service that allows users to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload a PDF file&lt;/li&gt;
&lt;li&gt;Ask natural language questions about it&lt;/li&gt;
&lt;li&gt;Get answers powered by OpenAI’s GPT-3.5-Turbo&lt;/li&gt;
&lt;li&gt;Behind the scenes, it uses RAG (Retrieval-Augmented Generation) with Redis Vector Search&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 What I Learned
&lt;/h2&gt;

&lt;p&gt;This project was a deep dive into several modern technologies and AI concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Redis Stack with Vector Search for storing and retrieving document chunks based on similarity&lt;/li&gt;
&lt;li&gt;✅ Docker for containerizing Redis and RedisInsight&lt;/li&gt;
&lt;li&gt;✅ RAG architecture to improve the relevance of LLM responses&lt;/li&gt;
&lt;li&gt;✅ Connecting AI APIs (OpenAI) with real-world documents&lt;/li&gt;
&lt;li&gt;✅ Using pdf-parse and multer for document processing in Node.js&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧬 How It Works (Architecture)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;User uploads a PDF

&lt;ul&gt;
&lt;li&gt;PDF is split into readable text chunks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chunks are embedded using OpenAI’s Embedding API (text-embedding-ada-002).&lt;/li&gt;
&lt;li&gt;Embeddings are stored in Redis using a custom doc_idx vector index. &lt;/li&gt;
&lt;li&gt;When a user asks a question, it is also embedded. &lt;/li&gt;
&lt;li&gt;Vector similarity search retrieves the top-matching chunks. &lt;/li&gt;
&lt;li&gt;GPT-3.5 is prompted using those chunks as context to answer the question.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;This is a classic RAG workflow: Retrieve → Augment → Generate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🧪 Example Use Cases
&lt;/h2&gt;

&lt;p&gt;You can upload any PDF document and ask questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“What are the key findings of this research?”&lt;/li&gt;
&lt;li&gt;“Who is the recipient in this contract?”&lt;/li&gt;
&lt;li&gt;“What’s the total amount in this invoice?”&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 Redis Vector Index (Manual Option)
&lt;/h2&gt;

&lt;p&gt;You can also manually create a vector index in Redis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;RedisInsight is available at: &lt;a href="http://localhost:8001" rel="noopener noreferrer"&gt;http://localhost:8001&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🔮 Future Improvements
&lt;/h2&gt;

&lt;p&gt;Here's what I plan to build next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧾 OCR Support: Use tesseract.js to support scanned PDFs.&lt;/li&gt;
&lt;li&gt;📄 Multi-format Support: Accept .docx, .csv, .txt files.&lt;/li&gt;
&lt;li&gt;🔐 User Authentication: Secure access and user-based storage.&lt;/li&gt;
&lt;li&gt;🗃 Document History: Save uploaded files, questions, and answers.&lt;/li&gt;
&lt;li&gt;🧠 LangChain Integration: For better orchestration and multi-step 
reasoning.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔐 Quick Security Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Validate file types (no .exe, etc.).&lt;/li&gt;
&lt;li&gt;Add rate limiting on question API.&lt;/li&gt;
&lt;li&gt;Use file size and token limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📦 Quickstart (Backend)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone &amp;lt;your-repo&amp;gt;
cd backend
npm install
touch .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;.env file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPENAI_API_KEY=your_openai_key
REDIS_URL=redis://localhost:6379
PORT=5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;/div&gt;



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

&lt;p&gt;Building this Document Q&amp;amp;A Assistant gave me real hands-on experience with modern AI workflows, vector databases, and LLM integration. It’s a strong foundation for many real-world applications like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Legal document search&lt;/li&gt;
&lt;li&gt;Financial report summarization&lt;/li&gt;
&lt;li&gt;Academic paper exploration&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This is just the beginning. With OCR, better file type support, and LangChain, the possibilities are endless.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Code repo can be found below on my github&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SulimanFURC/qa-doc-frontend" rel="noopener noreferrer"&gt;Frontend Repo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/SulimanFURC/doc-qa-backend-node" rel="noopener noreferrer"&gt;Backend Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👋 About Me&lt;br&gt;
I’m a frontend developer working with Angular, React, and AI-assisted tools. I love writing clean, scalable code and sharing what I learn along the way.&lt;/p&gt;

&lt;p&gt;Let’s connect in the comments — and don’t forget to ❤️ the post if you found it useful!&lt;/p&gt;

</description>
      <category>rag</category>
      <category>openai</category>
      <category>angular</category>
      <category>docker</category>
    </item>
    <item>
      <title>🚢 How to Dockerize Your Existing Angular Application</title>
      <dc:creator>Suliman Munawar khan</dc:creator>
      <pubDate>Mon, 16 Jun 2025 07:33:17 +0000</pubDate>
      <link>https://dev.to/sulimanmunawarkhan/how-to-dockerize-your-existing-angular-application-288c</link>
      <guid>https://dev.to/sulimanmunawarkhan/how-to-dockerize-your-existing-angular-application-288c</guid>
      <description>&lt;p&gt;Tired of hearing &lt;em&gt;“It works on my machine”&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;Let's fix that.&lt;/p&gt;

&lt;p&gt;Dockerizing your Angular app helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Package it with all dependencies&lt;/li&gt;
&lt;li&gt;Run it consistently on any machine&lt;/li&gt;
&lt;li&gt;Simplify deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this guide, you'll learn &lt;strong&gt;how to containerize your Angular app using Docker&lt;/strong&gt;, step-by-step — even if you're new to Docker.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧰 Prerequisites
&lt;/h3&gt;

&lt;p&gt;Make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Node.js and Angular CLI installed&lt;/li&gt;
&lt;li&gt;✅ Docker installed and running &lt;a href="https://www.docker.com/products/docker-desktop" rel="noopener noreferrer"&gt;Download Docker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;✅ An existing Angular app (any version works)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏗 Step 1: Build Your Angular App for Production
&lt;/h2&gt;

&lt;p&gt;Angular apps need to be built before being served in production.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng build --configuration production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📁 Step 2: Create Your Dockerfile
&lt;/h3&gt;

&lt;p&gt;Inside the root of your Angular project, create a file named: &lt;code&gt;Dockerfile&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Paste the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Stage 1: Build the Angular app
FROM node:18-alpine AS build

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm install

COPY . .
RUN npm run build -- --configuration production

# Stage 2: Serve the app using NGINX
FROM nginx:1.23-alpine

COPY --from=build /app/dist/* /usr/share/nginx/html

# Copy custom nginx config (optional)
COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📝 Notes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;First stage builds the Angular app using Node.js&lt;/li&gt;
&lt;li&gt;Second stage serves the build with a lightweight NGINX server&lt;/li&gt;
&lt;li&gt;We expose port 80 so Docker knows where the app runs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🌐 Step 3 (Optional): Add a Custom NGINX Config
&lt;/h3&gt;

&lt;p&gt;You can skip this if the default is fine. But for SPAs (like Angular), custom routing helps avoid 404 errors on refresh.&lt;/p&gt;

&lt;p&gt;Create a file: &lt;code&gt;nginx.conf&lt;/code&gt;&lt;br&gt;
Add:&lt;br&gt;
&lt;/p&gt;

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

  root /usr/share/nginx/html;
  index index.html;

  location / {
    try_files $uri $uri/ /index.html;
  }

  error_page 404 /index.html;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📦 Step 4: Add .dockerignore
&lt;/h3&gt;

&lt;p&gt;To speed up the build and avoid copying unnecessary files, create a &lt;code&gt;.dockerignore&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
dist
.git
.gitignore
Dockerfile
README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧪 Step 5: Build Your Docker Image
&lt;/h3&gt;

&lt;p&gt;From the root folder of your project, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t my-angular-app .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Install dependencies&lt;/li&gt;
&lt;li&gt;Build the Angular app&lt;/li&gt;
&lt;li&gt;Create a lightweight image ready to run&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Step 6: Run Your Container
&lt;/h3&gt;

&lt;p&gt;After the build completes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d -p 8080:80 my-angular-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit:&lt;br&gt;
👉 &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see your Angular app running in a Docker container!&lt;/p&gt;
&lt;h2&gt;
  
  
  🧼 Bonus: Clean Up
&lt;/h2&gt;

&lt;p&gt;To stop the container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps  # Find the container ID
docker stop &amp;lt;container-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🌍 Deploying to the Cloud?
&lt;/h2&gt;

&lt;p&gt;Now that your Angular app is dockerized, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Push it to Docker Hub or GitHub Container Registry&lt;/li&gt;
&lt;li&gt;Deploy it to Azure App Service, AWS ECS, Google Cloud Run, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  👋 About Me
&lt;/h3&gt;

&lt;p&gt;I’m a frontend developer working with Angular, React, and AI-assisted tools. I love writing clean, scalable code and sharing what I learn along the way.&lt;/p&gt;

&lt;p&gt;Let’s connect in the comments — and don’t forget to ❤️ the post if you found it useful!&lt;/p&gt;

&lt;p&gt;Happy Dockering!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>docker</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🔄 Smart HTTP Loader in Angular Using Interceptors – Show One Loader for All API Calls</title>
      <dc:creator>Suliman Munawar khan</dc:creator>
      <pubDate>Fri, 13 Jun 2025 17:24:48 +0000</pubDate>
      <link>https://dev.to/sulimanmunawarkhan/smart-http-loader-in-angular-using-interceptors-show-one-loader-for-all-api-calls-2m24</link>
      <guid>https://dev.to/sulimanmunawarkhan/smart-http-loader-in-angular-using-interceptors-show-one-loader-for-all-api-calls-2m24</guid>
      <description>&lt;p&gt;Ever faced this?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You make two or more HTTP requests in Angular&lt;/li&gt;
&lt;li&gt;Multiple loaders show up — and flicker&lt;/li&gt;
&lt;li&gt;Or the loader hides before all calls are done&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s fix that! In this article, I’ll walk you through how to build a &lt;strong&gt;global, smart HTTP loader&lt;/strong&gt; using Angular interceptors. It’ll:&lt;/p&gt;

&lt;p&gt;✅ Show just &lt;strong&gt;one&lt;/strong&gt; loader for &lt;strong&gt;any number of API calls&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ Stay visible &lt;strong&gt;until all requests finish&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ Make your app feel polished and professional&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 What’s the Problem?
&lt;/h2&gt;

&lt;p&gt;Angular apps often make multiple HTTP calls — maybe to load user data, dashboard stats, and notifications.&lt;/p&gt;

&lt;p&gt;But if each call has its own loader logic, the UI becomes a mess:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loaders flash on and off&lt;/li&gt;
&lt;li&gt;Users think the app is done loading when it's not&lt;/li&gt;
&lt;li&gt;Code becomes hard to manage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s centralize this using &lt;strong&gt;HTTP interceptors&lt;/strong&gt; and a shared &lt;strong&gt;LoaderService&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔧 Step-by-Step Implementation
&lt;/h2&gt;


&lt;h3&gt;
  
  
  1️⃣ Create the LoaderService
&lt;/h3&gt;

&lt;p&gt;This service will track the number of active requests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable({ providedIn: 'root' })
export class LoaderService {
  private requestCount = 0;
  public isLoading$ = new BehaviorSubject&amp;lt;boolean&amp;gt;(false);

  show() {
    this.requestCount++;
    if (this.requestCount === 1) {
      this.isLoading$.next(true);
    }
  }

  hide() {
    if (this.requestCount &amp;gt; 0) {
      this.requestCount--;
    }

    if (this.requestCount === 0) {
      this.isLoading$.next(false);
    }
  }

  reset() {
    this.requestCount = 0;
    this.isLoading$.next(false);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2️⃣ Create the HTTP Interceptor
&lt;/h3&gt;

&lt;p&gt;This interceptor will automatically call show() and hide().&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// loader.interceptor.ts
import { Injectable } from '@angular/core';
import {
  HttpInterceptor,
  HttpRequest,
  HttpHandler,
  HttpEvent,
} from '@angular/common/http';
import { Observable } from 'rxjs';
import { finalize } from 'rxjs/operators';
import { LoaderService } from './loader.service';

@Injectable()
export class LoaderInterceptor implements HttpInterceptor {
  constructor(private loaderService: LoaderService) {}

  intercept(
    req: HttpRequest&amp;lt;any&amp;gt;,
    next: HttpHandler
  ): Observable&amp;lt;HttpEvent&amp;lt;any&amp;gt;&amp;gt; {
    this.loaderService.show();

    return next.handle(req).pipe(
      finalize(() =&amp;gt; this.loaderService.hide())
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 Key point: The finalize() operator ensures hide() is called whether the request succeeds or fails.&lt;/p&gt;




&lt;h3&gt;
  
  
  3️⃣ Register the Interceptor
&lt;/h3&gt;

&lt;p&gt;Add it to your app module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// app.module.ts
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { LoaderInterceptor } from './loader.interceptor';

@NgModule({
  // ...
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: LoaderInterceptor,
      multi: true,
    },
  ],
})
export class AppModule {}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4️⃣ Show the Loader in the UI
&lt;/h3&gt;

&lt;p&gt;You can now show a spinner component anywhere using the isLoading$ observable.&lt;/p&gt;

&lt;p&gt;Here’s a simple example using Angular Material:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- app.component.html --&amp;gt;
&amp;lt;mat-progress-bar
  *ngIf="isLoading$ | async"
  mode="indeterminate"
  color="primary"
&amp;gt;&amp;lt;/mat-progress-bar&amp;gt;

&amp;lt;router-outlet&amp;gt;&amp;lt;/router-outlet&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// app.component.ts
import { Component } from '@angular/core';
import { LoaderService } from './loader.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
})
export class AppComponent {
  isLoading$ = this.loaderService.isLoading$;

  constructor(private loaderService: LoaderService) {}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Output Demo
&lt;/h3&gt;

&lt;p&gt;When multiple requests fire:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You’ll see one smooth loader&lt;/li&gt;
&lt;li&gt;It will disappear only when all requests complete&lt;/li&gt;
&lt;li&gt;Works across any part of your app&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠 Tips and Enhancements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Delay loader show by 100ms to avoid flashing for fast calls&lt;/li&gt;
&lt;li&gt;Add an exclude list inside the interceptor to skip loader for certain URLs (e.g. logging, analytics)&lt;/li&gt;
&lt;li&gt;Debounce or throttle UI updates if you’re tracking many rapid requests&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 Bonus: ngx-loading-bar (Optional Lib)
&lt;/h3&gt;

&lt;p&gt;Prefer a library? ngx-loading-bar integrates with Angular interceptors out of the box.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @ngx-loading-bar/core @ngx-loading-bar/http-client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// app.module.ts
import { LoadingBarHttpClientModule } from '@ngx-loading-bar/http-client';

@NgModule({
  imports: [LoadingBarHttpClientModule],
})
export class AppModule {}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop this in your layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ngx-loading-bar&amp;gt;&amp;lt;/ngx-loading-bar&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom 💥 Instant loader for all HTTP requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏁 Conclusion
&lt;/h3&gt;

&lt;p&gt;You now have a professional, smart loader system that just works 🔁&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Centralized&lt;/li&gt;
&lt;li&gt;Lightweight&lt;/li&gt;
&lt;li&gt;Easy to maintain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No more copy-pasting loader logic all over your components!&lt;/p&gt;

&lt;h3&gt;
  
  
  👋 About Me
&lt;/h3&gt;

&lt;p&gt;I’m a frontend developer working with Angular, React, and AI-assisted tools. I love writing clean, scalable code and sharing what I learn along the way.&lt;/p&gt;

&lt;p&gt;Let’s connect in the comments — and don’t forget to ❤️ the post if you found it useful!&lt;/p&gt;




&lt;p&gt;Would you like me to write the next article in this Angular Pro Tips series on &lt;strong&gt;dynamic dashboards with charts&lt;/strong&gt;?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>frontend</category>
      <category>typescript</category>
    </item>
    <item>
      <title>🔥 Angular Pro Tips: Creating a Custom Pipe for Human-Readable Numbers (K, M, B Format)</title>
      <dc:creator>Suliman Munawar khan</dc:creator>
      <pubDate>Thu, 12 Jun 2025 11:52:03 +0000</pubDate>
      <link>https://dev.to/sulimanmunawarkhan/angular-pro-tips-creating-a-custom-pipe-for-human-readable-numbers-k-m-b-format-38m8</link>
      <guid>https://dev.to/sulimanmunawarkhan/angular-pro-tips-creating-a-custom-pipe-for-human-readable-numbers-k-m-b-format-38m8</guid>
      <description>&lt;p&gt;Displaying large numbers in dashboards or reports can clutter your UI and overwhelm users. Let’s solve this by creating a custom Angular pipe that converts numbers into a more readable format — like 1,500 to 1.5K and 2,500,000 to 2.5M.&lt;/p&gt;

&lt;p&gt;In this post, you'll learn how to build a clean, reusable pipe that formats large numbers using suffixes like K, M, and B.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Why Use a Custom Pipe?
&lt;/h2&gt;

&lt;p&gt;Angular comes with built-in pipes (like date, currency, and number) — but sometimes you need more control. A custom pipe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeps templates clean&lt;/li&gt;
&lt;li&gt;Promotes reusability&lt;/li&gt;
&lt;li&gt;Keeps formatting logic separated from business logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚙️ Step 1: Generate the Pipe
&lt;/h2&gt;

&lt;p&gt;In your Angular project, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng generate pipe numberSuffix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a new file: number-suffix.pipe.ts.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠 Step 2: Add the Logic
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;number-suffix.pipe.ts&lt;/strong&gt; and replace the contents with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Pipe, PipeTransform } from '@angular/core';
@Pipe({ name: 'numberSuffix' })
export class NumberSuffixPipe implements PipeTransform {
  transform(value: number): string {
    if (value == null) return '';
    if (value &amp;lt; 1000) return value.toString();
    const suffixes = ['', 'K', 'M', 'B'];
    const tier = Math.floor(Math.log10(value) / 3);
    if (tier === 0) return value.toString();
    const suffix = suffixes[tier];
    const scale = Math.pow(10, tier * 3);
    const scaled = value / scale;
    return scaled.toFixed(2).replace(/\.00$/, '') + suffix;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💡 What’s Happening Here:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;We find the “tier” (thousands, millions, billions) based on the number’s size.&lt;/li&gt;
&lt;li&gt;We scale the number down and attach the appropriate suffix.&lt;/li&gt;
&lt;li&gt;.toFixed(2).replace(/.00$/, '') ensures clean output — e.g., 1.00K becomes 1K.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧪 Step 3: Use the Pipe in Your Template
&lt;/h2&gt;

&lt;p&gt;Example usage in a component template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p&amp;gt;{{ 950 | numberSuffix }}&amp;lt;/p&amp;gt;         &amp;lt;!-- Output: 950 --&amp;gt;
&amp;lt;p&amp;gt;{{ 1500 | numberSuffix }}&amp;lt;/p&amp;gt;        &amp;lt;!-- Output: 1.5K --&amp;gt;
&amp;lt;p&amp;gt;{{ 2000000 | numberSuffix }}&amp;lt;/p&amp;gt;     &amp;lt;!-- Output: 2M --&amp;gt;
&amp;lt;p&amp;gt;{{ 7250000000 | numberSuffix }}&amp;lt;/p&amp;gt;  &amp;lt;!-- Output: 7.25B --&amp;gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✨ Optional Enhancements
&lt;/h2&gt;

&lt;p&gt;You can extend the pipe to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support custom decimal places (toFixed(1) or toFixed(0))&lt;/li&gt;
&lt;li&gt;Add support for trillions (T) or other units&lt;/li&gt;
&lt;li&gt;Format negative numbers or currency strings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let your use case guide you!&lt;/p&gt;

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

&lt;p&gt;We just built a handy little utility that can instantly improve the readability of your data-heavy UIs.&lt;/p&gt;

&lt;p&gt;✅ Clean&lt;br&gt;
✅ Reusable&lt;br&gt;
✅ Declarative in templates&lt;/p&gt;

&lt;h2&gt;
  
  
  👀 Up Next in Angular Pro Tips
&lt;/h2&gt;

&lt;p&gt;In the next post, we’ll build a smart loader using HTTP interceptors — showing one loading indicator no matter how many requests fire off at once.&lt;/p&gt;

&lt;p&gt;Follow me for more Angular and AI programming insights — and feel free to drop questions or suggestions in the comments!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>frontend</category>
      <category>productivity</category>
    </item>
    <item>
      <title>🚀 Bringing Cloud Ideas to Life: My AI-Powered Project Idea Generator</title>
      <dc:creator>Suliman Munawar khan</dc:creator>
      <pubDate>Fri, 30 May 2025 19:15:15 +0000</pubDate>
      <link>https://dev.to/sulimanmunawarkhan/bringing-cloud-ideas-to-life-my-ai-powered-project-idea-generator-c06</link>
      <guid>https://dev.to/sulimanmunawarkhan/bringing-cloud-ideas-to-life-my-ai-powered-project-idea-generator-c06</guid>
      <description>&lt;p&gt;Hi there! 👋 I’m thrilled to share a new project I’ve been working on — it’s called CloudIdeaGeneration. 🌥️ This web app helps you come up with interesting cloud project ideas that match your cloud provider, your skill level, and the services you’re curious about. Let me walk you through how it all works!&lt;/p&gt;

&lt;p&gt;🌟 Why I Built It&lt;br&gt;
When I first started exploring the world of cloud computing — AWS, Azure, and Google Cloud — I felt a little lost. There were just too many services to pick from, and I didn’t always know where to start. So, I thought:&lt;/p&gt;

&lt;p&gt;“What if I had a tool that could suggest cloud projects tailored to my experience and the services I want to learn?”&lt;/p&gt;

&lt;p&gt;That’s exactly what CloudIdeaGeneration does!&lt;/p&gt;

&lt;p&gt;💡 How It Works&lt;br&gt;
Using the power of AI, this app can suggest project ideas based on:&lt;br&gt;
✅ The cloud provider you want to use (AWS, Azure, or GCP)&lt;br&gt;
✅ Your skill level: Beginner, Intermediate, or Advanced&lt;br&gt;
✅ The specific services you’re excited about&lt;/p&gt;

&lt;p&gt;For example, if you’re just starting with Azure and want to learn about Azure Functions and Blob Storage, it’ll give you beginner-friendly project ideas you can build right away!&lt;/p&gt;

&lt;p&gt;🔥 Features You’ll Love&lt;br&gt;
🌈 AI-Powered Suggestions&lt;br&gt;
Choose between OpenAI and Gemini (by Google) to generate unique and relevant project ideas.&lt;/p&gt;

&lt;p&gt;🌈 Easy Selection&lt;br&gt;
Pick your cloud provider and select the services you’re curious about — no more guesswork!&lt;/p&gt;

&lt;p&gt;🌈 Detailed Project Plans&lt;br&gt;
Get everything you need to kick off your project:&lt;/p&gt;

&lt;p&gt;A catchy title and clear description&lt;/p&gt;

&lt;p&gt;Difficulty rating&lt;/p&gt;

&lt;p&gt;Estimated time to build&lt;/p&gt;

&lt;p&gt;High-level implementation steps&lt;/p&gt;

&lt;p&gt;Cost insights with links to official pricing&lt;/p&gt;

&lt;p&gt;Stretch goals if you want to take it further&lt;/p&gt;

&lt;p&gt;Alternative services you can explore&lt;/p&gt;

&lt;p&gt;🌈 Modern &amp;amp; Responsive UI&lt;br&gt;
Built with Bootstrap 5 and FontAwesome icons — so it looks great on any device.&lt;/p&gt;

&lt;p&gt;🌈 Dark Mode Ready&lt;br&gt;
Switch between light and dark themes to match your mood!&lt;/p&gt;

&lt;p&gt;🛠️ How It’s Built&lt;br&gt;
Here’s what’s under the hood:&lt;/p&gt;

&lt;p&gt;Frontend: Angular&lt;/p&gt;

&lt;p&gt;Backend: Node.js and Express&lt;/p&gt;

&lt;p&gt;Security: CORS protection, rate limiting, and secure headers with Helmet&lt;/p&gt;

&lt;p&gt;APIs: Use either OpenAI or Gemini to power the project suggestions.&lt;/p&gt;

&lt;p&gt;To keep everything clean and scalable, I separated the app into two repos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend&lt;/li&gt;
&lt;li&gt;Backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 Where to Find It&lt;br&gt;
👉 Try it out here: &lt;a href="https://cloud-idea-generator.netlify.app/" rel="noopener noreferrer"&gt;CloudIdeaGeneration App&lt;/a&gt;&lt;br&gt;
👉 Backend is running smoothly on Render.com and the frontend is live on Netlify.&lt;/p&gt;

&lt;p&gt;Just select your options and click “Generate Ideas” — you’ll get three tailored project ideas every time!&lt;/p&gt;

&lt;p&gt;💭 Final Thoughts&lt;br&gt;
I built this app because I know how tricky it can be to find that perfect first project or the next step in your cloud journey. My hope is that CloudIdeaGeneration makes it easier, faster, and a lot more fun. 🌟&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts!&lt;br&gt;
💡 How can I make this tool even better?&lt;br&gt;
💡 Are there other features you’d like to see?&lt;br&gt;
💡 Or maybe you have new ideas for services or providers to include?&lt;/p&gt;

&lt;p&gt;Your feedback will help me keep refining and expanding CloudIdeaGeneration so it can be as helpful as possible for everyone in the cloud community.&lt;/p&gt;

&lt;p&gt;If you’re learning cloud tech, give it a try and let me know what you think!&lt;br&gt;
And if you’re curious, check out the source code on GitHub and feel free to contribute.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gemini</category>
      <category>openai</category>
      <category>angular</category>
    </item>
  </channel>
</rss>
