<?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: SHIVAM UPADHYAY</title>
    <description>The latest articles on DEV Community by SHIVAM UPADHYAY (@upshivam786).</description>
    <link>https://dev.to/upshivam786</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3363702%2F62c03908-e71c-43c5-be0e-ba16be6a50d2.jpeg</url>
      <title>DEV Community: SHIVAM UPADHYAY</title>
      <link>https://dev.to/upshivam786</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/upshivam786"/>
    <language>en</language>
    <item>
      <title>Testing CAST AI on GKE: A Hands-On Kubernetes Workload Optimization Lab</title>
      <dc:creator>SHIVAM UPADHYAY</dc:creator>
      <pubDate>Fri, 31 Jul 2026 12:38:02 +0000</pubDate>
      <link>https://dev.to/upshivam786/testing-cast-ai-on-gke-a-hands-on-kubernetes-workload-optimization-lab-3lep</link>
      <guid>https://dev.to/upshivam786/testing-cast-ai-on-gke-a-hands-on-kubernetes-workload-optimization-lab-3lep</guid>
      <description>&lt;p&gt;I intentionally over-provisioned a Kubernetes application just to see whether CAST AI could detect it, recommend better resource requests, and actually optimize it.&lt;/p&gt;

&lt;p&gt;Spoiler: it did—but the biggest lesson wasn't about cost savings. It was about understanding the difference between resource requests, actual usage, and infrastructure cost.&lt;/p&gt;

&lt;p&gt;🤔 Why I Built This Lab&lt;/p&gt;

&lt;p&gt;When we deploy applications to Kubernetes, we usually write something like this:&lt;/p&gt;

&lt;p&gt;resources:&lt;br&gt;
  requests:&lt;br&gt;
    cpu: "1000m"&lt;br&gt;
    memory: "1Gi"&lt;/p&gt;

&lt;p&gt;limits:&lt;br&gt;
    cpu: "1500m"&lt;br&gt;
    memory: "1500Mi"&lt;/p&gt;

&lt;p&gt;But here's the question:&lt;/p&gt;

&lt;p&gt;How do you know if those numbers are correct?&lt;/p&gt;

&lt;p&gt;Most of us guess.&lt;/p&gt;

&lt;p&gt;Sometimes we copy them from another project.&lt;/p&gt;

&lt;p&gt;Sometimes we simply over-provision because we don't want the application to crash.&lt;/p&gt;

&lt;p&gt;That's exactly what I did for this experiment.&lt;/p&gt;

&lt;p&gt;🏗️ The Lab Setup&lt;/p&gt;

&lt;p&gt;I built a very small application instead of using a complex microservice.&lt;/p&gt;

&lt;p&gt;Tech Stack&lt;/p&gt;

&lt;p&gt;FastAPI&lt;br&gt;
Docker&lt;br&gt;
Google Kubernetes Engine (GKE)&lt;br&gt;
Google Artifact Registry&lt;br&gt;
CAST AI&lt;/p&gt;

&lt;p&gt;The deployment flow looked like this:&lt;/p&gt;

&lt;p&gt;FastAPI&lt;br&gt;
     │&lt;br&gt;
Docker Image&lt;br&gt;
     │&lt;br&gt;
Artifact Registry&lt;br&gt;
     │&lt;br&gt;
GKE Cluster&lt;br&gt;
     │&lt;br&gt;
Deployment (2 Pods)&lt;br&gt;
     │&lt;br&gt;
ClusterIP Service&lt;br&gt;
     │&lt;br&gt;
CAST AI&lt;/p&gt;

&lt;p&gt;☕ The Coffee API&lt;/p&gt;

&lt;p&gt;The application only exposes two endpoints.&lt;/p&gt;

&lt;p&gt;@app.get("/")&lt;br&gt;
def home():&lt;br&gt;
    return {&lt;br&gt;
        "message": "Coffee Shop API",&lt;br&gt;
        "hostname": socket.gethostname()&lt;br&gt;
    }&lt;/p&gt;

&lt;p&gt;@app.get("/coffee")&lt;br&gt;
def coffee():&lt;br&gt;
    return {&lt;br&gt;
        "coffee": "Cappuccino",&lt;br&gt;
        "price": 120&lt;br&gt;
    }&lt;/p&gt;

&lt;p&gt;Nothing fancy.&lt;/p&gt;

&lt;p&gt;The goal wasn't the application.&lt;/p&gt;

&lt;p&gt;The goal was the infrastructure.&lt;/p&gt;

&lt;p&gt;🎯 Intentionally Over-Provisioning the Pods&lt;/p&gt;

&lt;p&gt;Each Pod requested:&lt;/p&gt;

&lt;p&gt;resources:&lt;br&gt;
  requests:&lt;br&gt;
    cpu: "1000m"&lt;br&gt;
    memory: "1Gi"&lt;/p&gt;

&lt;p&gt;and I deployed 2 replicas.&lt;/p&gt;

&lt;p&gt;So Kubernetes reserved:&lt;/p&gt;

&lt;p&gt;2 CPU&lt;br&gt;
2 GiB Memory&lt;/p&gt;

&lt;p&gt;for an application that barely did anything.&lt;/p&gt;

&lt;p&gt;🚀 Deploying to GKE&lt;/p&gt;

&lt;p&gt;After building the Docker image, I pushed it to Artifact Registry and deployed it to GKE.&lt;/p&gt;

&lt;p&gt;Everything looked healthy.&lt;/p&gt;

&lt;p&gt;2 Pods&lt;br&gt;
Running&lt;br&gt;
Ready&lt;/p&gt;

&lt;p&gt;At this point, Kubernetes had no idea the application was oversized.&lt;/p&gt;

&lt;p&gt;It simply respected the resource requests I had defined.&lt;/p&gt;

&lt;p&gt;🔍 Connecting CAST AI&lt;/p&gt;

&lt;p&gt;I connected the cluster to CAST AI.&lt;/p&gt;

&lt;p&gt;Interestingly, onboarding wasn't completely smooth.&lt;/p&gt;

&lt;p&gt;I ran into several issues:&lt;/p&gt;

&lt;p&gt;missing gke-gcloud-auth-plugin&lt;br&gt;
expired CAST AI authentication&lt;br&gt;
missing IAM permissions&lt;br&gt;
Kubernetes RBAC&lt;/p&gt;

&lt;p&gt;After fixing those, CAST AI started collecting workload metrics.&lt;/p&gt;

&lt;p&gt;📊 The Interesting Part&lt;/p&gt;

&lt;p&gt;After some time, CAST AI analyzed my workload.&lt;/p&gt;

&lt;p&gt;My deployment requested:&lt;/p&gt;

&lt;p&gt;CPU&lt;br&gt;
1 CPU per Pod&lt;/p&gt;

&lt;p&gt;Memory&lt;br&gt;
1 GiB per Pod&lt;/p&gt;

&lt;p&gt;But actual usage looked more like:&lt;/p&gt;

&lt;p&gt;CPU&lt;br&gt;
≈ 3-4m&lt;/p&gt;

&lt;p&gt;Memory&lt;br&gt;
≈ 30 MiB&lt;/p&gt;

&lt;p&gt;That was a huge difference.&lt;/p&gt;

&lt;p&gt;💡 CAST AI Recommendation&lt;/p&gt;

&lt;p&gt;Instead of recommending something extreme like 4m CPU, CAST AI suggested:&lt;/p&gt;

&lt;p&gt;Resource    Before  Recommendation&lt;br&gt;
CPU 1 CPU   750m&lt;br&gt;
Memory  1 GiB   768 MiB&lt;/p&gt;

&lt;p&gt;It also estimated around 25% workload cost reduction.&lt;/p&gt;

&lt;p&gt;Screenshot&lt;/p&gt;

&lt;p&gt;(Insert your CAST AI optimization screenshot here)&lt;/p&gt;

&lt;p&gt;🤔 Why Not Just Recommend 4m CPU?&lt;/p&gt;

&lt;p&gt;This was actually my favorite learning.&lt;/p&gt;

&lt;p&gt;If the application is only using 4m CPU...&lt;/p&gt;

&lt;p&gt;...why recommend 750m?&lt;/p&gt;

&lt;p&gt;Because optimization isn't simply:&lt;/p&gt;

&lt;p&gt;request = current usage&lt;/p&gt;

&lt;p&gt;Production workloads experience:&lt;/p&gt;

&lt;p&gt;startup spikes&lt;br&gt;
traffic bursts&lt;br&gt;
background jobs&lt;br&gt;
unpredictable load&lt;/p&gt;

&lt;p&gt;A good optimizer leaves enough headroom for those situations.&lt;/p&gt;

&lt;p&gt;✅ Verifying It From Kubernetes&lt;/p&gt;

&lt;p&gt;I didn't want to trust only the dashboard.&lt;/p&gt;

&lt;p&gt;So I verified everything directly from Kubernetes.&lt;/p&gt;

&lt;p&gt;kubectl get pod  \&lt;br&gt;
-o jsonpath='{.status.containerStatuses[0].allocatedResources}'&lt;/p&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "cpu":"750m",&lt;br&gt;
  "memory":"768Mi"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;That was pretty satisfying.&lt;/p&gt;

&lt;p&gt;🧠 Biggest Takeaways&lt;/p&gt;

&lt;p&gt;This experiment completely changed how I think about Kubernetes resources.&lt;/p&gt;

&lt;p&gt;I learned that these are not the same thing:&lt;/p&gt;

&lt;p&gt;Requested Resources&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Actual Usage&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Recommended Resources&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Allocated Resources&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Infrastructure Cost&lt;/p&gt;

&lt;p&gt;Those five numbers often get mixed together.&lt;/p&gt;

&lt;p&gt;Understanding the difference is the first step toward Kubernetes cost optimization.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Before this project I thought Kubernetes cost optimization mostly meant:&lt;/p&gt;

&lt;p&gt;"Find cheaper virtual machines."&lt;/p&gt;

&lt;p&gt;Now I'd describe it differently:&lt;/p&gt;

&lt;p&gt;Start by making sure your workloads request only the resources they actually need.&lt;/p&gt;

&lt;p&gt;Node optimization comes later.&lt;/p&gt;

&lt;p&gt;Workload optimization comes first.&lt;/p&gt;

&lt;p&gt;📚 Project Repository&lt;/p&gt;

&lt;p&gt;I documented the complete lab including:&lt;/p&gt;

&lt;p&gt;GKE setup&lt;br&gt;
CAST AI onboarding&lt;br&gt;
Docker deployment&lt;br&gt;
Kubernetes networking&lt;br&gt;
Cost monitoring&lt;br&gt;
Workload optimization&lt;br&gt;
Troubleshooting&lt;/p&gt;

&lt;p&gt;👉 GitHub:&lt;br&gt;
&lt;a href="https://github.com/Upshivam786/castai-gke-workload-optimization-lab" rel="noopener noreferrer"&gt;https://github.com/Upshivam786/castai-gke-workload-optimization-lab&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🙌 Thanks for Reading&lt;/p&gt;

&lt;p&gt;If you've experimented with Kubernetes cost optimization tools like CAST AI, Karpenter, Goldilocks, or Vertical Pod Autoscaler, I'd love to hear about your experience.&lt;/p&gt;

&lt;p&gt;Happy learning! 🚀&lt;/p&gt;

&lt;p&gt;Tags:&lt;/p&gt;

&lt;h1&gt;
  
  
  kubernetes #gke #devops #docker #googlecloud #finops #mlops #castai
&lt;/h1&gt;

</description>
      <category>cloud</category>
      <category>devops</category>
      <category>infrastructure</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>I Built an AI That Designs MLOps Infrastructure (Without Letting AI Generate YAML)</title>
      <dc:creator>SHIVAM UPADHYAY</dc:creator>
      <pubDate>Thu, 09 Jul 2026 04:46:18 +0000</pubDate>
      <link>https://dev.to/upshivam786/i-built-an-ai-that-designs-mlops-infrastructure-without-letting-ai-generate-yaml-5akh</link>
      <guid>https://dev.to/upshivam786/i-built-an-ai-that-designs-mlops-infrastructure-without-letting-ai-generate-yaml-5akh</guid>
      <description>&lt;p&gt;If you've ever started an AI project, you've probably asked yourself questions like:&lt;/p&gt;

&lt;p&gt;Should I deploy on Kubernetes or Cloud Run?&lt;br&gt;
Do I need Redis?&lt;br&gt;
Which database fits this workload?&lt;br&gt;
How should I structure CI/CD?&lt;br&gt;
What monitoring stack should I use?&lt;/p&gt;

&lt;p&gt;Choosing an architecture is often harder than writing the application itself.&lt;/p&gt;

&lt;p&gt;I wanted to see if AI could help with those decisions while keeping the generated infrastructure deterministic and reliable.&lt;/p&gt;

&lt;p&gt;That idea became DeployCraft AI.&lt;/p&gt;

&lt;p&gt;The Goal&lt;/p&gt;

&lt;p&gt;The application asks for a few high-level inputs:&lt;/p&gt;

&lt;p&gt;Application Framework&lt;br&gt;
Cloud Provider&lt;br&gt;
Deployment Target&lt;br&gt;
Database&lt;br&gt;
Vector Database&lt;br&gt;
Cache&lt;br&gt;
Monitoring&lt;br&gt;
Authentication&lt;br&gt;
Traffic&lt;br&gt;
Budget&lt;br&gt;
High Availability&lt;/p&gt;

&lt;p&gt;Instead of generating code from a prompt, it builds a structured deployment blueprint.&lt;/p&gt;

&lt;p&gt;The output includes:&lt;/p&gt;

&lt;p&gt;✅ Architecture reasoning&lt;br&gt;
✅ Architecture score&lt;br&gt;
✅ Mermaid diagram&lt;br&gt;
✅ Docker Compose / Kubernetes / Cloud Run manifests&lt;br&gt;
✅ GitHub Actions workflow&lt;br&gt;
✅ Security report&lt;br&gt;
✅ Monitoring recommendations&lt;br&gt;
✅ Cost estimation&lt;br&gt;
✅ Downloadable ZIP package&lt;br&gt;
The Most Important Design Decision&lt;/p&gt;

&lt;p&gt;One thing I intentionally didn't do:&lt;/p&gt;

&lt;p&gt;I never let the LLM generate deployment manifests.&lt;/p&gt;

&lt;p&gt;Instead, I separated the project into three layers.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                       Configuration
                           │
                           ▼
                      Rules Engine
                           │
                           ▼
                         Blueprint
                     ┌───────────────┐
                     │               │
                     ▼               ▼
                  Generators     AI Advisor
                     │               │
                     ▼               ▼
                    YAML          Explanations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Everything infrastructure-related is deterministic.&lt;/p&gt;

&lt;p&gt;The rules layer decides:&lt;/p&gt;

&lt;p&gt;which services exist&lt;br&gt;
networking&lt;br&gt;
environment variables&lt;br&gt;
autoscaling&lt;br&gt;
storage&lt;br&gt;
deployment topology&lt;/p&gt;

&lt;p&gt;No AI involved.&lt;/p&gt;

&lt;p&gt;Template-Based Infrastructure&lt;/p&gt;

&lt;p&gt;Once the blueprint is built, Jinja2 templates generate:&lt;/p&gt;

&lt;p&gt;Docker Compose&lt;br&gt;
Kubernetes manifests&lt;br&gt;
Cloud Run YAML&lt;br&gt;
GitHub Actions workflow&lt;/p&gt;

&lt;p&gt;This means every deployment file is reproducible.&lt;/p&gt;

&lt;p&gt;AI Only Explains&lt;/p&gt;

&lt;p&gt;The LLM receives the architecture and answers questions like:&lt;/p&gt;

&lt;p&gt;Why Cloud Run?&lt;br&gt;
Why PostgreSQL?&lt;br&gt;
Why Redis?&lt;br&gt;
What are the risks?&lt;br&gt;
How could this scale?&lt;/p&gt;

&lt;p&gt;The AI becomes an architecture reviewer rather than an infrastructure generator.&lt;/p&gt;

&lt;p&gt;I found this separation makes the outputs much more trustworthy.&lt;/p&gt;

&lt;p&gt;Some Interesting Challenges&lt;/p&gt;

&lt;p&gt;A few things that took more work than expected:&lt;/p&gt;

&lt;p&gt;Supporting multiple deployment targets&lt;/p&gt;

&lt;p&gt;Each target needs different templates while sharing the same architecture model.&lt;/p&gt;

&lt;p&gt;Making AI output reliable&lt;/p&gt;

&lt;p&gt;LLMs occasionally fail or return unexpected responses.&lt;/p&gt;

&lt;p&gt;Instead of crashing the application, I implemented graceful fallbacks so the UI always remains usable.&lt;/p&gt;

&lt;p&gt;Architecture scoring&lt;/p&gt;

&lt;p&gt;Rather than asking AI for a score, the application evaluates:&lt;/p&gt;

&lt;p&gt;Security&lt;br&gt;
Scalability&lt;br&gt;
Reliability&lt;br&gt;
Cost Efficiency&lt;br&gt;
Observability&lt;/p&gt;

&lt;p&gt;using deterministic rules.&lt;/p&gt;

&lt;p&gt;Packaging everything&lt;/p&gt;

&lt;p&gt;Instead of displaying lots of text, the application bundles every generated artifact into a downloadable ZIP.&lt;/p&gt;

&lt;p&gt;Tech Stack&lt;br&gt;
Python&lt;br&gt;
Gradio&lt;br&gt;
Hugging Face Inference API&lt;br&gt;
Jinja2&lt;br&gt;
Docker&lt;br&gt;
Kubernetes&lt;br&gt;
Google Cloud Run&lt;br&gt;
GitHub Actions&lt;br&gt;
What I Learned&lt;/p&gt;

&lt;p&gt;This project reinforced something I've been thinking about for a while:&lt;/p&gt;

&lt;p&gt;AI doesn't need to replace software engineering.&lt;/p&gt;

&lt;p&gt;It becomes much more useful when it's responsible for reasoning, while deterministic code remains responsible for correctness.&lt;/p&gt;

&lt;p&gt;That balance made the application significantly more reliable.&lt;/p&gt;

&lt;p&gt;Try It&lt;/p&gt;

&lt;p&gt;🌐 Live Demo: &lt;a href="https://huggingface.co/spaces/Upshivam786/deploycraft-ai" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/Upshivam786/deploycraft-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 GitHub: &lt;a href="https://github.com/Upshivam786/DeployCraft-AI/tree/main" rel="noopener noreferrer"&gt;https://github.com/Upshivam786/DeployCraft-AI/tree/main&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd appreciate any feedback or suggestions from people working in DevOps, Cloud Engineering, or MLOps.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building an AI Cloud Cost Intelligence Platform That Doesn't Let AI Make Infrastructure Decisions</title>
      <dc:creator>SHIVAM UPADHYAY</dc:creator>
      <pubDate>Mon, 29 Jun 2026 04:11:00 +0000</pubDate>
      <link>https://dev.to/upshivam786/building-an-ai-cloud-cost-intelligence-platform-that-doesnt-let-ai-make-infrastructure-decisions-5gbn</link>
      <guid>https://dev.to/upshivam786/building-an-ai-cloud-cost-intelligence-platform-that-doesnt-let-ai-make-infrastructure-decisions-5gbn</guid>
      <description>&lt;p&gt;Most AI-powered cloud optimization demos follow a simple approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Azure Resources
      ↓
Large Language Model
      ↓
Recommendations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, this seems impressive.&lt;/p&gt;

&lt;p&gt;But while building my own Azure Cost Intelligence Platform, I ran into a problem that completely changed my architecture.&lt;/p&gt;

&lt;p&gt;The AI was generating infrastructure recommendations that looked correct—but some of them simply didn't exist.&lt;/p&gt;

&lt;p&gt;For example, it suggested VM SKUs that Azure doesn't support and even produced Azure CLI commands with incorrect parameters. That was a wake-up call.&lt;/p&gt;

&lt;p&gt;Instead of trying to "prompt engineer" my way out of the problem, I redesigned the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  The New Architecture
&lt;/h2&gt;

&lt;p&gt;Rather than letting AI make decisions, I split the system into independent components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Azure Scanner&lt;/strong&gt; → Discovers Azure resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metrics Engine&lt;/strong&gt; → Collects real CPU utilization from Azure Monitor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing Engine&lt;/strong&gt; → Retrieves actual VM pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Advisor Integration&lt;/strong&gt; → Fetches Microsoft's own optimization recommendations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommendation Engine&lt;/strong&gt; → Applies deterministic Python rules to decide what should happen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command Builder&lt;/strong&gt; → Generates verified Azure CLI commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM&lt;/strong&gt; → Explains &lt;em&gt;why&lt;/em&gt; a recommendation matters in simple language.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI never decides &lt;strong&gt;what&lt;/strong&gt; to do—it only explains decisions that have already been made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Instead of asking the LLM:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What should I do with this VM?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;the backend first gathers facts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current VM SKU: &lt;code&gt;Standard_B2ts_v2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Average CPU: &lt;strong&gt;0.3%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Peak CPU: &lt;strong&gt;1.9%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Current Cost: &lt;strong&gt;$1.64/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Recommended Cost: &lt;strong&gt;$0.90/month&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The recommendation engine then determines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resize VM
↓
Target SKU: Standard_B2ats_v2
↓
Estimated Savings: $0.74/month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, the LLM produces a human-friendly explanation like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This virtual machine is significantly underutilized. Resizing it can reduce monthly costs without affecting current workloads."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice that the AI never invents the recommendation or the command—it only explains verified data.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;FastAPI&lt;/li&gt;
&lt;li&gt;React + TypeScript&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Azure Container Apps&lt;/li&gt;
&lt;li&gt;Azure Monitor&lt;/li&gt;
&lt;li&gt;Azure Advisor&lt;/li&gt;
&lt;li&gt;Azure Pricing APIs&lt;/li&gt;
&lt;li&gt;Azure Managed Identity&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Groq API (LLM)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This project taught me an important lesson:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI should not replace engineering logic.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cloud infrastructure decisions should come from verified APIs, business rules, and deterministic code. AI adds the most value when it helps engineers understand those decisions, not when it generates them.&lt;/p&gt;

&lt;p&gt;That's the architecture I'll continue using as I expand this platform with historical cost trends, anomaly detection, and multi-cloud (AWS &amp;amp; GCP) support.&lt;/p&gt;




&lt;p&gt;If you're building AI-assisted DevOps or FinOps tools, I'd love to hear how you're balancing automation with reliability.&lt;/p&gt;

</description>
      <category>blog</category>
    </item>
    <item>
      <title>Building a Self-Hosted MLOps Platform from Scratch with FastAPI, PostgreSQL, GCS, and Docker</title>
      <dc:creator>SHIVAM UPADHYAY</dc:creator>
      <pubDate>Tue, 23 Jun 2026 09:25:20 +0000</pubDate>
      <link>https://dev.to/upshivam786/building-a-self-hosted-mlops-platform-from-scratch-with-fastapi-postgresql-gcs-and-docker-46i0</link>
      <guid>https://dev.to/upshivam786/building-a-self-hosted-mlops-platform-from-scratch-with-fastapi-postgresql-gcs-and-docker-46i0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Over the past few months, I set out to answer a simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does it take to build a production-style MLOps platform from scratch?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While tools like MLflow, SageMaker Model Registry, and Kubeflow provide powerful capabilities, I wanted to understand the underlying architecture and engineering decisions behind them. Instead of only using existing platforms, I decided to build my own.&lt;/p&gt;

&lt;p&gt;The result is &lt;strong&gt;Kimchi&lt;/strong&gt;, a self-hosted MLOps platform that supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model Registration&lt;/li&gt;
&lt;li&gt;Model Versioning&lt;/li&gt;
&lt;li&gt;Artifact Management&lt;/li&gt;
&lt;li&gt;Experiment Tracking&lt;/li&gt;
&lt;li&gt;Audit Logging&lt;/li&gt;
&lt;li&gt;Role-Based Access Control (RBAC)&lt;/li&gt;
&lt;li&gt;Python SDK&lt;/li&gt;
&lt;li&gt;CI/CD Automation&lt;/li&gt;
&lt;li&gt;Google Cloud Storage Integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project was built using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;SQLAlchemy&lt;/li&gt;
&lt;li&gt;Alembic&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Google Cloud Storage (GCS)&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;JWT Authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this article, I'll share how the project evolved from a simple model registry into a multi-phase MLOps platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;In many machine learning projects, models are often stored in random locations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local machines&lt;/li&gt;
&lt;li&gt;Shared drives&lt;/li&gt;
&lt;li&gt;Cloud storage buckets&lt;/li&gt;
&lt;li&gt;Team chat channels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over time, teams start asking difficult questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which model version is currently in production?&lt;/li&gt;
&lt;li&gt;Who promoted this version?&lt;/li&gt;
&lt;li&gt;Which dataset was used to train it?&lt;/li&gt;
&lt;li&gt;What accuracy did it achieve?&lt;/li&gt;
&lt;li&gt;Where is the model artifact stored?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without a centralized platform, answering these questions becomes difficult.&lt;/p&gt;

&lt;p&gt;I wanted a system that could act as a single source of truth for the ML lifecycle.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 1 — Building the Foundation
&lt;/h2&gt;

&lt;p&gt;The first phase focused on creating a Model Registry.&lt;/p&gt;

&lt;p&gt;Key capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model registration&lt;/li&gt;
&lt;li&gt;Model versioning&lt;/li&gt;
&lt;li&gt;Artifact upload and download&lt;/li&gt;
&lt;li&gt;JWT Authentication&lt;/li&gt;
&lt;li&gt;Role-Based Access Control&lt;/li&gt;
&lt;li&gt;Google Cloud Storage integration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;

&lt;p&gt;The platform separates metadata from artifacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL stores model metadata&lt;/li&gt;
&lt;li&gt;GCS stores model artifacts&lt;/li&gt;
&lt;li&gt;FastAPI exposes REST APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture mirrors how many production MLOps systems are designed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 2 — Governance Through Audit Logging
&lt;/h2&gt;

&lt;p&gt;Once the registry was functional, I realized something important:&lt;/p&gt;

&lt;p&gt;The platform had no memory.&lt;/p&gt;

&lt;p&gt;If someone promoted a model to production or deleted a version, there was no way to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who made the change&lt;/li&gt;
&lt;li&gt;What changed&lt;/li&gt;
&lt;li&gt;When it happened&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To solve this, I implemented an Audit Logging system.&lt;/p&gt;

&lt;p&gt;Every write operation now creates an immutable audit record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CREATE&lt;/li&gt;
&lt;li&gt;UPDATE&lt;/li&gt;
&lt;li&gt;DELETE&lt;/li&gt;
&lt;li&gt;PROMOTE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows teams to trace every important lifecycle event.&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;Shivam
PROMOTE
Model Version 5
staging → production
2026-06-16 05:01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This feature brought governance and accountability to the platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 3 — Experiment Tracking
&lt;/h2&gt;

&lt;p&gt;At this stage, models could be registered, but training information was still buried inside artifact files.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;metrics.json&lt;br&gt;
params.json&lt;/p&gt;

&lt;p&gt;could be uploaded, but the platform couldn't answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which model has the highest accuracy?&lt;/li&gt;
&lt;li&gt;Which version achieved the best F1 score?&lt;/li&gt;
&lt;li&gt;What hyperparameters were used?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To solve this, I introduced Experiment Tracking.&lt;/p&gt;

&lt;p&gt;A new Training Run layer stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hyperparameters&lt;/li&gt;
&lt;li&gt;Metrics&lt;/li&gt;
&lt;li&gt;Dataset hashes&lt;/li&gt;
&lt;li&gt;Framework information&lt;/li&gt;
&lt;li&gt;Training duration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This enables powerful queries such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /experiments?min_accuracy=0.90
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /models/{id}/versions/compare
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The platform now supports experiment search, filtering, and version comparison.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 4 — Improving Developer Experience
&lt;/h2&gt;

&lt;p&gt;After building the core platform, I shifted focus to usability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python SDK
&lt;/h3&gt;

&lt;p&gt;Instead of interacting with the API using raw curl commands, users can now work with a Python SDK.&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 python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kimchi_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ModelRegistry&lt;/span&gt;

&lt;span class="n"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ModelRegistry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fraud-detector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GitHub Actions CI/CD
&lt;/h3&gt;

&lt;p&gt;Every push automatically triggers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dependency installation&lt;/li&gt;
&lt;li&gt;Automated test execution&lt;/li&gt;
&lt;li&gt;Validation checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures platform stability and catches regressions early.&lt;/p&gt;

&lt;h3&gt;
  
  
  Admin APIs
&lt;/h3&gt;

&lt;p&gt;Role management is now handled through APIs instead of direct database modifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Refresh Tokens
&lt;/h3&gt;

&lt;p&gt;Refresh tokens provide a smoother authentication experience and prepare the platform for future UI integrations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;Building this platform taught me much more than simply writing APIs.&lt;/p&gt;

&lt;p&gt;Some of the key lessons included:&lt;/p&gt;

&lt;h3&gt;
  
  
  Designing for Evolution
&lt;/h3&gt;

&lt;p&gt;Each phase built on top of the previous one.&lt;/p&gt;

&lt;p&gt;Instead of trying to build everything at once, I focused on creating a strong foundation and then extending it incrementally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Governance Matters
&lt;/h3&gt;

&lt;p&gt;Tracking who changed what becomes increasingly important as teams grow.&lt;/p&gt;

&lt;p&gt;Audit logging turned out to be one of the most valuable additions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Experiment Metadata is First-Class Data
&lt;/h3&gt;

&lt;p&gt;Metrics and hyperparameters should not live only inside artifact files.&lt;/p&gt;

&lt;p&gt;Making them queryable dramatically improves usability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Developer Experience Matters
&lt;/h3&gt;

&lt;p&gt;Features like SDKs and CI/CD pipelines are often overlooked but are critical for adoption.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;The next phase focuses on Governance and Enterprise Readiness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signed GCS URLs&lt;/li&gt;
&lt;li&gt;Model Cards&lt;/li&gt;
&lt;li&gt;Dataset Lineage&lt;/li&gt;
&lt;li&gt;Drift Monitoring&lt;/li&gt;
&lt;li&gt;Kubernetes Deployments&lt;/li&gt;
&lt;li&gt;Terraform Infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to continue evolving Kimchi into a production-grade MLOps platform.&lt;/p&gt;




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

&lt;p&gt;This project started as an exercise to understand how model registries work internally.&lt;/p&gt;

&lt;p&gt;Over time, it evolved into a hands-on exploration of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MLOps&lt;/li&gt;
&lt;li&gt;Backend Engineering&lt;/li&gt;
&lt;li&gt;Cloud Infrastructure&lt;/li&gt;
&lt;li&gt;Governance&lt;/li&gt;
&lt;li&gt;Experiment Tracking&lt;/li&gt;
&lt;li&gt;Developer Experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building systems from scratch is one of the best ways to understand the trade-offs behind production software.&lt;/p&gt;

&lt;p&gt;If you're interested in MLOps, backend engineering, or cloud-native systems, I highly recommend building something similar yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Repository
&lt;/h2&gt;

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

&lt;p&gt;[Add your GitHub repository URL here]&lt;/p&gt;

&lt;p&gt;If you have suggestions, feedback, or ideas for future phases, feel free to connect with me.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>python</category>
      <category>mlops</category>
    </item>
    <item>
      <title>🎉 Happy New Year, Devs! 🎉</title>
      <dc:creator>SHIVAM UPADHYAY</dc:creator>
      <pubDate>Fri, 02 Jan 2026 05:15:22 +0000</pubDate>
      <link>https://dev.to/upshivam786/happy-new-year-devs-4j2e</link>
      <guid>https://dev.to/upshivam786/happy-new-year-devs-4j2e</guid>
      <description>&lt;p&gt;Grateful for another year of learning, building, breaking, and fixing things.&lt;br&gt;
Looking forward to writing cleaner code, learning new tools, and growing together as a community in 2026.&lt;/p&gt;

&lt;p&gt;Wishing you all successful builds, fewer bugs, and lots of innovation ahead 🚀&lt;br&gt;
Happy New Year!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Completed Linux for DevOps Beginners 🚀 #devops #linux #learninginpublic #resources</title>
      <dc:creator>SHIVAM UPADHYAY</dc:creator>
      <pubDate>Thu, 24 Jul 2025 16:13:49 +0000</pubDate>
      <link>https://dev.to/upshivam786/completed-linux-for-devops-beginners-devops-linux-learninginpublic-resources-57j9</link>
      <guid>https://dev.to/upshivam786/completed-linux-for-devops-beginners-devops-linux-learninginpublic-resources-57j9</guid>
      <description>&lt;p&gt;Hey everyone! 👋&lt;/p&gt;

&lt;p&gt;Just wanted to share a small win — I’ve completed my first Linux course as part of my DevOps journey. 🐧&lt;br&gt;
I started with the basics: terminal commands, file management, permissions, and a bit of scripting.&lt;/p&gt;

&lt;p&gt;Why Linux?&lt;br&gt;
Because it’s everywhere in DevOps — servers, containers, cloud. It’s like the home base, so I knew I had to start here.&lt;/p&gt;

&lt;p&gt;If you’re also starting out, here are a few free resources I found super helpful:&lt;br&gt;
🔹 The Linux Command Line book — linuxcommand.org/tlcl.php&lt;br&gt;
🔹 Linux Journey (fun and simple) — linuxjourney.com&lt;br&gt;
🔹 FreeCodeCamp YouTube video — search "Linux crash course freecodecamp"&lt;br&gt;
🔹 Codecademy CLI basics — codecademy.com&lt;br&gt;
🔹 Ubuntu command line guide — ubuntu.com/tutorials/command-line-for-beginners&lt;/p&gt;

&lt;p&gt;Next, I’m going to explore Git and shell scripting. Excited to keep learning and building step by step.&lt;/p&gt;

&lt;p&gt;If you're also learning DevOps, let’s connect. We can share tips and support each other. This is all part of learning in public. :)&lt;/p&gt;

&lt;h1&gt;
  
  
  DevOpsJourney #LinuxBasics #KeepLearning #100DaysOfDevOps
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>My First Step into DevOps: Linux Basics</title>
      <dc:creator>SHIVAM UPADHYAY</dc:creator>
      <pubDate>Thu, 17 Jul 2025 12:34:37 +0000</pubDate>
      <link>https://dev.to/upshivam786/my-first-step-into-devops-linux-basics-4ih6</link>
      <guid>https://dev.to/upshivam786/my-first-step-into-devops-linux-basics-4ih6</guid>
      <description>&lt;p&gt;Hey Dev Community! 👋&lt;/p&gt;

&lt;p&gt;I'm excited to kick off my journey toward becoming a DevOps Engineer.&lt;br&gt;
Step 1: I'm diving into Linux for Beginners — building the foundation brick by brick. 🧱&lt;/p&gt;

&lt;p&gt;I'll be sharing my progress, learnings, and challenges here.&lt;br&gt;
If you're on a similar path or have tips to share, let's connect and grow together!&lt;/p&gt;

&lt;h1&gt;
  
  
  DevOps #Linux #BeginnerJourney #LearningInPublic
&lt;/h1&gt;

</description>
      <category>devops</category>
      <category>linux</category>
      <category>career</category>
    </item>
  </channel>
</rss>
