<?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: Limani Ndou</title>
    <description>The latest articles on DEV Community by Limani Ndou (@limani).</description>
    <link>https://dev.to/limani</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%2F3732979%2F49dd130b-fd29-4355-8a6e-a18ea57c6e06.png</url>
      <title>DEV Community: Limani Ndou</title>
      <link>https://dev.to/limani</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/limani"/>
    <language>en</language>
    <item>
      <title>🚀 How I Ran 11 Microservices with OpenChoreo</title>
      <dc:creator>Limani Ndou</dc:creator>
      <pubDate>Wed, 25 Mar 2026 22:05:07 +0000</pubDate>
      <link>https://dev.to/limani/how-i-ran-11-microservices-with-openchoreo-ag3</link>
      <guid>https://dev.to/limani/how-i-ran-11-microservices-with-openchoreo-ag3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I used OpenChoreo to deploy and manage the Google Cloud microservices demo (11 services) on my local machine. The result was a cleaner developer workflow, better service visibility, and a production-like platform experience without building custom platform tooling from scratch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;What OpenChoreo?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;OpenChoreo&lt;/strong&gt; is a developer platform for &lt;strong&gt;Kubernetes&lt;/strong&gt; offering development and architecture abstractions, a Backstage-powered developer portal, application CI/CD, GitOps, and observability. It composes &lt;strong&gt;CNCF&lt;/strong&gt; and complementary projects into a modular, extensible framework that provides both strong governance for platform engineers and simplified abstractions for developers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenChoreo was developed by WSO2 and is now part of the Cloud Native Computing Foundation (CNCF) ecosystem.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;Why OpenChoreo?&lt;/strong&gt;&lt;br&gt;
OpenChoreo it provides all essential building blocks of an Internal Developer Platform (IDP) :&lt;/p&gt;

&lt;p&gt;High-level APIs for modeling cloud-native applications&lt;br&gt;
A Control Plane that understands and enforces these APIs with GitOps support&lt;br&gt;
A built-in workflow engine for CI/CD pipelines and automation&lt;br&gt;
An opinionated Data Plane with runtime enforcement of design-time semantics&lt;br&gt;
Built-in security, networking, and observability integrations&lt;br&gt;
This is the key reason I used it for this 11-microservice demo.&lt;/p&gt;

&lt;p&gt;3️⃣ &lt;strong&gt;GCP Microservices Demo: What It Includes&lt;/strong&gt;&lt;br&gt;
Repository: &lt;a href="https://github.com/GoogleCloudPlatform/microservices-demo" rel="noopener noreferrer"&gt;https://github.com/GoogleCloudPlatform/microservices-demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌐 frontend (Go): Serves the website and auto-generates user session IDs.&lt;br&gt;
🛒 cartservice (C#): Stores/retrieves cart items in Redis.&lt;br&gt;
📚 productcatalogservice (Go): Product listing, search, and product details from JSON.&lt;br&gt;
💱 currencyservice (Node.js): Converts money values using ECB exchange rates (highest QPS).&lt;br&gt;
💳 paymentservice (Node.js): Mock credit card charge and transaction ID generation.&lt;br&gt;
🚚 shippingservice (Go): Shipping cost estimates and mock shipping execution.&lt;br&gt;
✉️ emailservice (Python): Mock order confirmation emails.&lt;br&gt;
🎯 checkoutservice (Go): Orchestrates cart, payment, shipping, and email flow.&lt;br&gt;
💡 recommendationservice (Python): Suggests products from cart context.&lt;br&gt;
📢 adservice (Java): Returns text ads based on context words.&lt;br&gt;
🔄 loadgenerator (Python/Locust): Simulates realistic shopping traffic.&lt;br&gt;
4️⃣ What I Did (Step by Step)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚙️ Prerequisites&lt;br&gt;
Ensure the following before you begin:&lt;br&gt;
-Docker (Engine 26.0+ recommended)&lt;br&gt;
-Allocate at least 4 GB RAM and 2 CPUs.&lt;br&gt;
-If you plan to install with WorkflowPlane, allocate 8 GB RAM and 4 CPUs for optimal performance.&lt;br&gt;
-5-10 minutes of setup time&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Step 1: Start OpenChoreo Quick Start&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; openchoreo-quick-start &lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nt"&gt;--pull&lt;/span&gt; always &lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; //var/run/docker.sock:/var/run/docker.sock &lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;-p&lt;/span&gt; 9443:9443 &lt;span class="sb"&gt;`&lt;/span&gt;
  ghcr.io/openchoreo/quick-start:v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fug1zsmtasstswm3p1vq2.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%2Fug1zsmtasstswm3p1vq2.png" alt=" " width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Install OpenChoreo(two options):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./install.sh

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmg20cvhsh9dqjy2ylfg0.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%2Fmg20cvhsh9dqjy2ylfg0.png" alt=" " width="800" height="394"&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%2F33ht2p8jm6efx3icd1oy.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%2F33ht2p8jm6efx3icd1oy.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With observability&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./install.sh &lt;span class="nt"&gt;--with-build&lt;/span&gt; &lt;span class="nt"&gt;--with-observability&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Choose a Deployment Option&lt;br&gt;
There are two ways to deploy the GCP Microservices Demo:&lt;/p&gt;

&lt;p&gt;Option A: Use the built-in OpenChoreo deploy script for GCP Microservices Demo (11 services: frontend, cart, checkout, payment, and more)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./deploy-gcp-demo.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Option B: Clone and deploy manually&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--depth&lt;/span&gt; 1 &lt;span class="nt"&gt;--branch&lt;/span&gt; v0 https://github.com/GoogleCloudPlatform/microservices-demo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;microservices-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; ./release/kubernetes-manifests.yaml
I used Option B &lt;span class="o"&gt;(&lt;/span&gt;clone and deploy&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Verify in OpenChoreo UI&lt;br&gt;
Access the UI at: &lt;code&gt;http://openchoreo.localhost:8080/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Default login credentials:&lt;/p&gt;

&lt;p&gt;Username: &lt;code&gt;admin@openchoreo.dev&lt;/code&gt;&lt;br&gt;
Password: &lt;code&gt;Admin@123&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1frup8664uxz6h9fmj7e.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%2F1frup8664uxz6h9fmj7e.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;Project and component catalog&lt;br&gt;
Deployment pipeline view&lt;br&gt;
Environment progression&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%2Fkzq4d2vsaa9gtkfn6hug.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%2Fkzq4d2vsaa9gtkfn6hug.png" alt=" " width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 5: Validate End-to-End App Behavior&lt;br&gt;
I opened the storefront and validated core user flow (browse, cart, checkout).&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%2F6ec04p8gys9vauqgobu8.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%2F6ec04p8gys9vauqgobu8.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📚 &lt;strong&gt;References&lt;/strong&gt;&lt;br&gt;
Documentation: &lt;a href="https://openchoreo.dev/docs/" rel="noopener noreferrer"&gt;https://openchoreo.dev/docs/&lt;/a&gt;&lt;br&gt;
Documentation: &lt;a href="https://insights.linuxfoundation.org/project/openchore" rel="noopener noreferrer"&gt;https://insights.linuxfoundation.org/project/openchore&lt;/a&gt;&lt;br&gt;
OpenChoreo Quick Start Guide:&lt;br&gt;
&lt;a href="https://openchoreo.dev/docs/getting-started/quick-start-guide/" rel="noopener noreferrer"&gt;https://openchoreo.dev/docs/getting-started/quick-start-guide/&lt;/a&gt;&lt;br&gt;
GCP Microservices Demo Repository:&lt;br&gt;
&lt;a href="https://github.com/GoogleCloudPlatform/microservices-demo" rel="noopener noreferrer"&gt;https://github.com/GoogleCloudPlatform/microservices-demo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>openchoreo</category>
      <category>kubernetes</category>
      <category>microservices</category>
      <category>devops</category>
    </item>
    <item>
      <title>🚀 How I Built a Serverless Expense Tracker Using AWS Lambda and Amazon S3 - No Server Required</title>
      <dc:creator>Limani Ndou</dc:creator>
      <pubDate>Fri, 20 Mar 2026 19:50:36 +0000</pubDate>
      <link>https://dev.to/limani/how-i-built-a-serverless-expense-tracker-using-aws-lambda-and-amazon-s3-no-server-required-n24</link>
      <guid>https://dev.to/limani/how-i-built-a-serverless-expense-tracker-using-aws-lambda-and-amazon-s3-no-server-required-n24</guid>
      <description>&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%2Fdq2avg3odalndq7jn1iu.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%2Fdq2avg3odalndq7jn1iu.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;br&gt;
🚀I have built a fully serverless expense tracking pipeline on AWS  no servers, no manual work, just pure cloud automation. &lt;/p&gt;

&lt;p&gt;The problem: combining monthly expense CSVs every year is tedious and error-prone. So I automated the entire process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🪣 Amazon S3 (Simple Storage Service)&lt;/strong&gt;&lt;br&gt;
Amazon S3 is a cloud-based object storage service that stores and retrieves any amount of data from anywhere in the world. It can also watch for new files and automatically notify other AWS services when something is uploaded.&lt;br&gt;
💡 Think of it as a smart cloud hard drive the moment a CSV lands in S3, it wakes up Lambda automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚡ AWS Lambda&lt;/strong&gt;&lt;br&gt;
AWS Lambda is a serverless compute service that runs your code in response to events, without provisioning or managing any servers. You only pay for the milliseconds your code actually runs.&lt;br&gt;
💡 Think of it as a worker who sleeps until you need them triggered, runs the task, goes back to sleep. No server running 24/7, no idle costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔐 AWS IAM (Identity &amp;amp; Access Management)&lt;/strong&gt;&lt;br&gt;
AWS IAM is a service that controls access to AWS resources by defining who is authenticated and what actions they are authorised to perform.&lt;br&gt;
💡 Think of it as the security guard of AWS without IAM, Lambda would not be allowed to touch a single file in S3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📊 Amazon CloudWatch&lt;/strong&gt;&lt;br&gt;
Amazon CloudWatch is a monitoring and observability service that collects logs, metrics, and events from AWS services in real time.&lt;br&gt;
💡 Think of it as the CCTV of your cloud application every log line, every error, every execution time recorded automatically.&lt;/p&gt;

&lt;p&gt;⚙️ How The Pipeline Works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload monthly CSV to S3&lt;/li&gt;
&lt;li&gt;S3 fires an event → Lambda wakes up&lt;/li&gt;
&lt;li&gt;Lambda reads the new file + existing master&lt;/li&gt;
&lt;li&gt;Merges, sorts by date, removes duplicates&lt;/li&gt;
&lt;li&gt;Recalculates category totals in South African Rand&lt;/li&gt;
&lt;li&gt;Saves updated master file back to S3 instantly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;📈 Real Results — 3 Months of SA Expense Data:&lt;br&gt;
• ✅ 50 transactions merged automatically&lt;br&gt;
• ✅ 0 manual steps required&lt;br&gt;
• ✅ Categories: Groceries, Fuel, Utilities, Health &amp;amp; more&lt;br&gt;
• 💰 Grand Total (YTD 2026): R41,859.97&lt;/p&gt;

&lt;p&gt;🔗 Full source code, architecture diagram &amp;amp; sample data if you want to try:&lt;br&gt;
👉 &lt;a href="https://lnkd.in/dQNytjKD" rel="noopener noreferrer"&gt;https://lnkd.in/dQNytjKD&lt;/a&gt;&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>aws</category>
      <category>s3</category>
      <category>lambda</category>
    </item>
  </channel>
</rss>
