<?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: Shreya Nalawade</title>
    <description>The latest articles on Forem by Shreya Nalawade (@shreya111111).</description>
    <link>https://forem.com/shreya111111</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%2F1069729%2F2ca6fa2e-3722-46b4-8e99-2a5b29926898.jpeg</url>
      <title>Forem: Shreya Nalawade</title>
      <link>https://forem.com/shreya111111</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/shreya111111"/>
    <language>en</language>
    <item>
      <title>Running Gemma 4 Inside a Docker Container with GPU Passthrough</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Mon, 18 May 2026 19:24:34 +0000</pubDate>
      <link>https://forem.com/shreya111111/running-gemma-4-inside-a-docker-container-with-gpu-passthrough-2g8d</link>
      <guid>https://forem.com/shreya111111/running-gemma-4-inside-a-docker-container-with-gpu-passthrough-2g8d</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Gemma 4 Challenge: Write About Gemma 4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here's a situation every ML team eventually hits.&lt;/p&gt;

&lt;p&gt;Your intern gets Gemma 4 running locally. Beautiful. Fast. Impresses the standup. Then they leave for the semester. Three weeks later, nobody can reproduce the setup. The model was in a path that no longer exists. The Python version was wrong. The CUDA libraries conflicted with PyTorch. Someone &lt;code&gt;pip install&lt;/code&gt;ed something globally and broke everything.&lt;/p&gt;

&lt;p&gt;This is why Docker exists. And yet, every Gemma 4 setup guide I've found uses either the Ollama GUI, LM Studio's drag-and-drop interface, or bare &lt;code&gt;ollama run&lt;/code&gt; commands that vanish when the terminal closes. None of them answer the actual question a dev team has:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How do we version-control this, ship it to staging, and have it work the same way every time?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This guide answers that. By the end, you'll have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;Dockerfile&lt;/code&gt; your team can pin, review, and modify in a PR&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;docker-compose.yml&lt;/code&gt; that brings up the full stack with one command&lt;/li&gt;
&lt;li&gt;A running Gemma 4 endpoint that speaks &lt;strong&gt;OpenAI's API format&lt;/strong&gt; — meaning zero changes to any code that already calls GPT-4o&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's build it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Docker + GPU Is Annoying (and How It Actually Works)
&lt;/h2&gt;

&lt;p&gt;Before the files, a quick mental model — because this is where most people get confused.&lt;/p&gt;

&lt;p&gt;CUDA is not inside your container. The NVIDIA driver lives on the &lt;strong&gt;host machine&lt;/strong&gt;. The container runtime (Docker) needs a way to reach through the container wall and talk to those drivers. That bridge is the &lt;strong&gt;NVIDIA Container Toolkit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's the flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Container
    └── CUDA libraries (inside the image)
          └── NVIDIA Container Runtime  ← the bridge
                └── Host NVIDIA Driver  ← never inside the container
                      └── Physical GPU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You do NOT need to install CUDA on your host. Only the NVIDIA driver.&lt;/li&gt;
&lt;li&gt;You do NOT bundle the driver inside your Docker image. Only CUDA libraries.&lt;/li&gt;
&lt;li&gt;The container toolkit version on your host must be compatible with your driver version.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A common gotcha: if your host driver is old (e.g., 470.x), it cannot run CUDA 12.x containers. The CUDA version inside your image must be &lt;strong&gt;less than or equal to&lt;/strong&gt; what your driver supports. Check first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvidia-smi
&lt;span class="c"&gt;# Look for: "CUDA Version: XX.X" in the top-right corner&lt;/span&gt;
&lt;span class="c"&gt;# That's the maximum CUDA your driver supports&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Prerequisites Checklist
&lt;/h2&gt;

&lt;p&gt;Before touching any Docker file, verify these four things on your host machine:&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;# 1. Confirm NVIDIA GPU is visible&lt;/span&gt;
lspci | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; nvidia

&lt;span class="c"&gt;# 2. Check driver is installed and working&lt;/span&gt;
nvidia-smi

&lt;span class="c"&gt;# 3. Check Docker version (need 19.03+ for native --gpus support)&lt;/span&gt;
docker &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check NVIDIA Container Toolkit is installed&lt;/span&gt;
nvidia-ctk &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If step 4 fails, install the toolkit:&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;# Ubuntu/Debian&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://nvidia.github.io/libnvidia-container/gpgkey | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/nvidia-container-toolkit.list

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nvidia-container-toolkit

&lt;span class="c"&gt;# Wire it into Docker&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nvidia-ctk runtime configure &lt;span class="nt"&gt;--runtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart docker

&lt;span class="c"&gt;# Test — you should see nvidia-smi output from inside a container&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--gpus&lt;/span&gt; all nvidia/cuda:12.3.0-base-ubuntu22.04 nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that last command shows your GPU, you're ready. If it errors, stop here and fix the driver — no amount of clever Dockerfiles will help.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup We're Building
&lt;/h2&gt;

&lt;p&gt;We're going to run three containers in a single Compose stack:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Container&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ollama serving Gemma 4 (with GPU)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;11434&lt;/code&gt; (internal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;litellm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OpenAI-compatible proxy in front of Ollama&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;8000&lt;/code&gt; (external)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model-puller&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One-shot container that pulls the model on first boot&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The LiteLLM proxy is the key piece most guides skip. It translates OpenAI API calls (&lt;code&gt;/v1/chat/completions&lt;/code&gt;) into Ollama's native format, adds API key auth, rate limiting, and request logging — all without touching your application code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;

&lt;p&gt;Create this directory layout before writing any files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gemma4-stack/
├── .env                    # Secrets and config — never commit this
├── .env.example            # Template for new team members
├── docker-compose.yml      # The full stack
├── Dockerfile.ollama       # Custom Ollama image with health checks
├── litellm/
│   └── config.yaml         # LiteLLM model routing config
├── scripts/
│   └── pull-model.sh       # Idempotent model pull script
└── tests/
    └── smoke_test.py       # Verify the stack works end-to-end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 1: The &lt;code&gt;.env&lt;/code&gt; File
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env — copy from .env.example and fill in your values&lt;/span&gt;
&lt;span class="c"&gt;# !! Never commit this file — add .env to .gitignore&lt;/span&gt;

&lt;span class="c"&gt;# Which Gemma 4 variant to run&lt;/span&gt;
&lt;span class="c"&gt;# Options: gemma4:e2b | gemma4:e4b | gemma4:26b | gemma4:31b&lt;/span&gt;
&lt;span class="nv"&gt;GEMMA_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gemma4:26b

&lt;span class="c"&gt;# API key for LiteLLM (clients use this to authenticate)&lt;/span&gt;
&lt;span class="c"&gt;# Generate a random one: openssl rand -hex 32&lt;/span&gt;
&lt;span class="nv"&gt;LITELLM_MASTER_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-your-secret-key-here

&lt;span class="c"&gt;# How long Ollama keeps the model in VRAM after the last request&lt;/span&gt;
&lt;span class="c"&gt;# Increase this if you have spare VRAM and want faster cold starts&lt;/span&gt;
&lt;span class="nv"&gt;OLLAMA_KEEP_ALIVE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10m

&lt;span class="c"&gt;# Max parallel inference requests (tune to your VRAM)&lt;/span&gt;
&lt;span class="nv"&gt;OLLAMA_NUM_PARALLEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2

&lt;span class="c"&gt;# HuggingFace token — needed only if you pull gated models&lt;/span&gt;
&lt;span class="nv"&gt;HF_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&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;&lt;span class="c"&gt;# .env.example — commit this&lt;/span&gt;
&lt;span class="nv"&gt;GEMMA_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gemma4:26b
&lt;span class="nv"&gt;LITELLM_MASTER_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-CHANGE-ME
&lt;span class="nv"&gt;OLLAMA_KEEP_ALIVE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10m
&lt;span class="nv"&gt;OLLAMA_NUM_PARALLEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2
&lt;span class="nv"&gt;HF_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: The Dockerfile
&lt;/h2&gt;

&lt;p&gt;This is where we diverge from every "just use the ollama image" guide. Our custom image adds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A proper health check endpoint (so Compose knows when Ollama is actually ready)&lt;/li&gt;
&lt;li&gt;A non-root user (security baseline for any production-adjacent setup)&lt;/li&gt;
&lt;li&gt;Pinned Ollama version (reproducibility)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dockerfile.ollama&lt;/span&gt;
&lt;span class="c"&gt;# Pin to a specific Ollama release — update deliberately, not accidentally&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ollama/ollama:0.9.3&lt;/span&gt;

&lt;span class="c"&gt;# Metadata&lt;/span&gt;
&lt;span class="k"&gt;LABEL&lt;/span&gt;&lt;span class="s"&gt; maintainer="your-team@yourcompany.com"&lt;/span&gt;
&lt;span class="k"&gt;LABEL&lt;/span&gt;&lt;span class="s"&gt; description="Ollama serving Gemma 4 with GPU passthrough"&lt;/span&gt;
&lt;span class="k"&gt;LABEL&lt;/span&gt;&lt;span class="s"&gt; gemma.version="gemma4"&lt;/span&gt;

&lt;span class="c"&gt;# GPU access configuration&lt;/span&gt;
&lt;span class="c"&gt;# NVIDIA_VISIBLE_DEVICES and NVIDIA_DRIVER_CAPABILITIES tell the&lt;/span&gt;
&lt;span class="c"&gt;# container runtime which GPU capabilities to expose.&lt;/span&gt;
&lt;span class="c"&gt;# "compute" = CUDA, "utility" = nvidia-smi&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; NVIDIA_VISIBLE_DEVICES=all&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; NVIDIA_DRIVER_CAPABILITIES=compute,utility&lt;/span&gt;

&lt;span class="c"&gt;# Ollama configuration&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; OLLAMA_HOST=0.0.0.0&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; OLLAMA_ORIGINS=*&lt;/span&gt;

&lt;span class="c"&gt;# Keep the model warm in VRAM (overridable via docker-compose env)&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; OLLAMA_KEEP_ALIVE=10m&lt;/span&gt;

&lt;span class="c"&gt;# Number of parallel inference slots&lt;/span&gt;
&lt;span class="c"&gt;# Each slot uses roughly model_size / 2 additional VRAM&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; OLLAMA_NUM_PARALLEL=2&lt;/span&gt;

&lt;span class="c"&gt;# Flash attention — reduces memory for long contexts&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; OLLAMA_FLASH_ATTENTION=1&lt;/span&gt;

&lt;span class="c"&gt;# Model storage location inside the container&lt;/span&gt;
&lt;span class="c"&gt;# We'll mount a volume here to persist across container restarts&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; OLLAMA_MODELS=/models&lt;/span&gt;

&lt;span class="c"&gt;# Create the models directory and set ownership&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /models &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod &lt;/span&gt;755 /models

&lt;span class="c"&gt;# Expose Ollama's API port&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 11434&lt;/span&gt;

&lt;span class="c"&gt;# Health check: ask Ollama if it's ready&lt;/span&gt;
&lt;span class="c"&gt;# --start-period gives it 60s to load before health checks count&lt;/span&gt;
&lt;span class="k"&gt;HEALTHCHECK&lt;/span&gt;&lt;span class="s"&gt; --interval=15s --timeout=10s --retries=5 --start-period=60s \&lt;/span&gt;
  CMD curl -sf http://localhost:11434/api/tags || exit 1

&lt;span class="c"&gt;# Default command — starts Ollama server&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["ollama", "serve"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why pin &lt;code&gt;ollama:0.9.3&lt;/code&gt; and not &lt;code&gt;ollama:latest&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because &lt;code&gt;latest&lt;/code&gt; on a production service means "surprise breaking changes on every &lt;code&gt;docker pull&lt;/code&gt;." Pin it. Update it intentionally via PR. When a new Ollama release drops and the team wants to update, the diff is one line and the change is reviewable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: The Model Pull Script
&lt;/h2&gt;

&lt;p&gt;This script runs once on startup and is idempotent — running it twice does nothing harmful:&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="c"&gt;# scripts/pull-model.sh&lt;/span&gt;
&lt;span class="c"&gt;# Pulls the Gemma 4 model if not already present&lt;/span&gt;
&lt;span class="c"&gt;# Safe to run multiple times — checks before pulling&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;OLLAMA_HOST&lt;/span&gt;&lt;span class="o"&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;OLLAMA_HOST&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;http&lt;/span&gt;://gemma4:11434&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;MODEL&lt;/span&gt;&lt;span class="o"&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;GEMMA_MODEL&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;gemma4&lt;/span&gt;:26b&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Waiting for Ollama to be ready at &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OLLAMA_HOST&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;

&lt;span class="c"&gt;# Wait up to 5 minutes for Ollama to respond&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 60&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  if &lt;/span&gt;curl &lt;span class="nt"&gt;-sf&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OLLAMA_HOST&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/tags"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Ollama is up."&lt;/span&gt;
    &lt;span class="nb"&gt;break
  &lt;/span&gt;&lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"    Attempt &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/60 — retrying in 5s..."&lt;/span&gt;
  &lt;span class="nb"&gt;sleep &lt;/span&gt;5
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Check if model already exists&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;curl &lt;span class="nt"&gt;-sf&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OLLAMA_HOST&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/tags"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MODEL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&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;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Model '&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MODEL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' already present. Skipping pull."&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Pulling model: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MODEL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"    This can take 5–20 minutes depending on your connection."&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"    The 26B model is ~15GB. Get a coffee."&lt;/span&gt;

curl &lt;span class="nt"&gt;-sf&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OLLAMA_HOST&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/pull"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MODEL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;stream&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: false}"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Pull complete. Model '&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MODEL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' is ready."&lt;/span&gt;
&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;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x scripts/pull-model.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 4: LiteLLM Config
&lt;/h2&gt;

&lt;p&gt;LiteLLM is the OpenAI-compatible gateway. This config tells it that "gemma-4" (what your app calls) maps to "ollama_chat/gemma4:26b" (what Ollama actually serves):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# litellm/config.yaml&lt;/span&gt;
&lt;span class="na"&gt;model_list&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Gemma 4 26B MoE — best balance of speed and quality&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemma-4&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama_chat/gemma4:26b&lt;/span&gt;
      &lt;span class="na"&gt;api_base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://gemma4:11434&lt;/span&gt;

  &lt;span class="c1"&gt;# Gemma 4 E4B — fast, low VRAM, good for quick tasks&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemma-4-fast&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama_chat/gemma4:e4b&lt;/span&gt;
      &lt;span class="na"&gt;api_base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://gemma4:11434&lt;/span&gt;

  &lt;span class="c1"&gt;# Gemma 4 31B Dense — maximum quality, needs 24GB+ VRAM&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemma-4-max&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama_chat/gemma4:31b&lt;/span&gt;
      &lt;span class="na"&gt;api_base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://gemma4:11434&lt;/span&gt;

&lt;span class="na"&gt;litellm_settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Log all requests (set to false in prod if you handle this elsewhere)&lt;/span&gt;
  &lt;span class="na"&gt;set_verbose&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

  &lt;span class="c1"&gt;# Drop unsupported params instead of erroring&lt;/span&gt;
  &lt;span class="c1"&gt;# Gemma doesn't support every OpenAI parameter (e.g., logprobs)&lt;/span&gt;
  &lt;span class="na"&gt;drop_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

  &lt;span class="c1"&gt;# Request timeout in seconds&lt;/span&gt;
  &lt;span class="na"&gt;request_timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt;

&lt;span class="na"&gt;general_settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Master key for authentication&lt;/span&gt;
  &lt;span class="c1"&gt;# Clients send: Authorization: Bearer sk-your-secret-key-here&lt;/span&gt;
  &lt;span class="na"&gt;master_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;os.environ/LITELLM_MASTER_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: The docker-compose.yml
&lt;/h2&gt;

&lt;p&gt;This is the centrepiece. Read it carefully — every decision has a comment explaining why:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="c1"&gt;# Gemma 4 production-grade local inference stack&lt;/span&gt;
&lt;span class="c1"&gt;# Usage: docker compose up -d&lt;/span&gt;
&lt;span class="c1"&gt;# First run: docker compose up -d &amp;amp;&amp;amp; docker compose logs -f model-puller&lt;/span&gt;

&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemma4-stack&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

  &lt;span class="c1"&gt;# ─────────────────────────────────────────────&lt;/span&gt;
  &lt;span class="c1"&gt;# OLLAMA: The inference engine with GPU access&lt;/span&gt;
  &lt;span class="c1"&gt;# ─────────────────────────────────────────────&lt;/span&gt;
  &lt;span class="na"&gt;gemma4&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile.ollama&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemma4-ollama&lt;/span&gt;

    &lt;span class="c1"&gt;# GPU passthrough — this is the magic line&lt;/span&gt;
    &lt;span class="c1"&gt;# "count: all" exposes every GPU on the host&lt;/span&gt;
    &lt;span class="c1"&gt;# Change to "count: 1" or "device_ids: ['0']" to pin a specific GPU&lt;/span&gt;
    &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;reservations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;devices&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nvidia&lt;/span&gt;
              &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;
              &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;gpu&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Model storage: named volume persists across container recreations&lt;/span&gt;
    &lt;span class="c1"&gt;# Without this, you re-download 15GB every time you update the image&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;gemma4-models:/models&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;OLLAMA_KEEP_ALIVE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${OLLAMA_KEEP_ALIVE:-10m}&lt;/span&gt;
      &lt;span class="na"&gt;OLLAMA_NUM_PARALLEL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${OLLAMA_NUM_PARALLEL:-2}&lt;/span&gt;
      &lt;span class="na"&gt;OLLAMA_FLASH_ATTENTION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
      &lt;span class="na"&gt;OLLAMA_MODELS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/models&lt;/span&gt;

    &lt;span class="c1"&gt;# Do NOT expose port 11434 to the host&lt;/span&gt;
    &lt;span class="c1"&gt;# All external traffic goes through LiteLLM on port 8000&lt;/span&gt;
    &lt;span class="c1"&gt;# This prevents clients from bypassing auth&lt;/span&gt;
    &lt;span class="na"&gt;expose&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;11434"&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;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&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;CMD"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;curl"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-sf"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/tags"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
      &lt;span class="na"&gt;start_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;60s&lt;/span&gt;

  &lt;span class="c1"&gt;# ─────────────────────────────────────────────&lt;/span&gt;
  &lt;span class="c1"&gt;# MODEL PULLER: Downloads Gemma 4 on first boot&lt;/span&gt;
  &lt;span class="c1"&gt;# Exits cleanly after pulling — not a long-running service&lt;/span&gt;
  &lt;span class="c1"&gt;# ─────────────────────────────────────────────&lt;/span&gt;
  &lt;span class="na"&gt;model-puller&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;curlimages/curl:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemma4-model-puller&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;./scripts/pull-model.sh:/pull-model.sh:ro&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;OLLAMA_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://gemma4:11434&lt;/span&gt;
      &lt;span class="na"&gt;GEMMA_MODEL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${GEMMA_MODEL:-gemma4:26b}&lt;/span&gt;

    &lt;span class="na"&gt;entrypoint&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;/bin/sh"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/pull-model.sh"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;gemma4&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;

    &lt;span class="c1"&gt;# This container should exit 0 after pulling the model&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no"&lt;/span&gt;

  &lt;span class="c1"&gt;# ─────────────────────────────────────────────&lt;/span&gt;
  &lt;span class="c1"&gt;# LITELLM: OpenAI-compatible API gateway&lt;/span&gt;
  &lt;span class="c1"&gt;# Your apps connect to THIS, not to Ollama directly&lt;/span&gt;
  &lt;span class="c1"&gt;# ─────────────────────────────────────────────&lt;/span&gt;
  &lt;span class="na"&gt;litellm&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;ghcr.io/berriai/litellm:main-stable&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemma4-litellm&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;./litellm/config.yaml:/app/config.yaml:ro&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;LITELLM_MASTER_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${LITELLM_MASTER_KEY}&lt;/span&gt;

    &lt;span class="na"&gt;command&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;--config"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/app/config.yaml"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--port"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# THIS is the only port exposed to your host machine&lt;/span&gt;
      &lt;span class="c1"&gt;# http://localhost:8000/v1 — drop-in replacement for OpenAI&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;

    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;gemma4&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&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;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&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;CMD"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;curl"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-sf"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8000/health"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;20s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;

&lt;span class="c1"&gt;# ─────────────────────────────────────────────&lt;/span&gt;
&lt;span class="c1"&gt;# VOLUMES&lt;/span&gt;
&lt;span class="c1"&gt;# ─────────────────────────────────────────────&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;gemma4-models&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
    &lt;span class="c1"&gt;# Uncomment to bind to a specific host path instead:&lt;/span&gt;
    &lt;span class="c1"&gt;# driver_opts:&lt;/span&gt;
    &lt;span class="c1"&gt;#   type: none&lt;/span&gt;
    &lt;span class="c1"&gt;#   o: bind&lt;/span&gt;
    &lt;span class="c1"&gt;#   device: /data/gemma4-models&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemma4-net&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 6: Boot It Up
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone or create the project directory&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;gemma4-stack

&lt;span class="c"&gt;# Copy the env template and fill in your master key&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;span class="c"&gt;# Edit .env — at minimum, set LITELLM_MASTER_KEY&lt;/span&gt;

&lt;span class="c"&gt;# Build the Ollama image and start the stack&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# Watch the model download (first run only — this takes a while)&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; model-puller

&lt;span class="c"&gt;# Once model-puller exits, check everything is healthy&lt;/span&gt;
docker compose ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output from &lt;code&gt;docker compose ps&lt;/code&gt; once everything is running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;NAME                   IMAGE                          STATUS
gemma4-ollama          gemma4-stack-gemma4            Up (healthy)
gemma4-litellm         ghcr.io/berriai/litellm:...   Up (healthy)
gemma4-model-puller    curlimages/curl:latest         Exited (0)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model-puller showing &lt;code&gt;Exited (0)&lt;/code&gt; is correct — it finished its job and stopped cleanly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Test the OpenAI-Compatible Endpoint
&lt;/h2&gt;

&lt;p&gt;Your stack is now running a drop-in OpenAI replacement at &lt;code&gt;http://localhost:8000/v1&lt;/code&gt;. Test it:&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;# Check available models&lt;/span&gt;
curl http://localhost:8000/v1/models &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LITELLM_MASTER_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Send a chat completion — same format as OpenAI&lt;/span&gt;
curl http://localhost:8000/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LITELLM_MASTER_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "gemma-4",
    "messages": [
      {
        "role": "system",
        "content": "You are a senior backend engineer doing code review."
      },
      {
        "role": "user",
        "content": "Review this Python function and identify any issues:\n\ndef get_user(id):\n    return db.query(f\"SELECT * FROM users WHERE id={id}\")"
      }
    ],
    "temperature": 0.3,
    "max_tokens": 512
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected response — Gemma 4 should immediately flag the SQL injection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chatcmpl-..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chat.completion"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gemma-4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"choices"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Critical issue: SQL injection vulnerability on line 2. The `id` parameter is interpolated directly into the query string with an f-string. An attacker could pass `id = '1 OR 1=1 --'` and retrieve all users. Fix: use parameterized queries:&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;```

python&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;def get_user(user_id: int):&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    return db.query(&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;        &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;SELECT * FROM users WHERE id = %s&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;        (user_id,)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    )&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;

```&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Also: rename the parameter from `id` to `user_id` — `id` shadows a Python built-in."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"finish_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stop"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 8: Drop It Into Your Existing Code
&lt;/h2&gt;

&lt;p&gt;Here's the part that makes this setup valuable to a team. If you already have code calling OpenAI, you change &lt;strong&gt;two lines&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  Python (openai SDK)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Before — calling OpenAI
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-your-openai-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# After — calling your local Gemma 4 stack
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_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/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# ← changed
&lt;/span&gt;    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LITELLM_MASTER_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="c1"&gt;# ← changed
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Everything below is identical — no other changes needed
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# or "gemma-4-fast" for E4B, "gemma-4-max" for 31B
&lt;/span&gt;    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a helpful assistant.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain what a Docker volume is in one sentence.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node.js / TypeScript
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Same two-line swap&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:8000/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LITELLM_MASTER_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemma-4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&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;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Write a TypeScript type for a paginated API response.&lt;/span&gt;&lt;span class="dl"&gt;"&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;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  LangChain
&lt;/h3&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;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;

&lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_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/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-litellm-master-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What are the SOLID principles? Give me one sentence per principle.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 9: The Smoke Test
&lt;/h2&gt;

&lt;p&gt;Add this to your CI pipeline or run it after deployment to verify the stack is working:&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="c1"&gt;# tests/smoke_test.py
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Smoke test for the Gemma 4 Docker stack.
Run with: python tests/smoke_test.py
Exit 0 = healthy. Exit 1 = something&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s broken.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GEMMA_BASE_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8000/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LITELLM_MASTER_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;MODEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GEMMA_MODEL_ALIAS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  ✓ &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  ✗ &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; + detail if detail else &lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Smoke test — &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Test 1: Models endpoint
&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;model_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Models endpoint&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;got: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model_ids&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Model &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MODEL&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;model_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Test 2: Basic chat completion
&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reply with exactly the word PONG and nothing else.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;

&lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Chat completion returns&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PONG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;got: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="si"&gt;!r}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Response time &amp;lt; 30s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;took &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;elapsed&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Test 3: Streaming
&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Count to 3, one number per line.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Streaming works&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;got &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; chunks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;All checks passed. Stack is healthy.&lt;/span&gt;&lt;span class="se"&gt;\n&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;h2&gt;
  
  
  Useful Day-to-Day Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start the stack&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# Tail logs from all containers&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt;

&lt;span class="c"&gt;# Tail logs from one container&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; gemma4

&lt;span class="c"&gt;# Check GPU utilization inside the container&lt;/span&gt;
docker &lt;span class="nb"&gt;exec &lt;/span&gt;gemma4-ollama nvidia-smi

&lt;span class="c"&gt;# List loaded models and their VRAM usage&lt;/span&gt;
docker &lt;span class="nb"&gt;exec &lt;/span&gt;gemma4-ollama ollama ps

&lt;span class="c"&gt;# Pull a different model (e.g., try 31B if you have the VRAM)&lt;/span&gt;
docker &lt;span class="nb"&gt;exec &lt;/span&gt;gemma4-ollama ollama pull gemma4:31b

&lt;span class="c"&gt;# Hard restart (keeps model volume intact)&lt;/span&gt;
docker compose restart gemma4

&lt;span class="c"&gt;# Full teardown — preserves the model volume&lt;/span&gt;
docker compose down

&lt;span class="c"&gt;# NUCLEAR: full teardown including the 15GB model volume&lt;/span&gt;
&lt;span class="c"&gt;# Only do this if you want to re-download everything&lt;/span&gt;
docker compose down &lt;span class="nt"&gt;-v&lt;/span&gt;

&lt;span class="c"&gt;# Update to a newer Ollama version (edit Dockerfile.ollama first)&lt;/span&gt;
docker compose build &lt;span class="nt"&gt;--no-cache&lt;/span&gt; gemma4
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; gemma4

&lt;span class="c"&gt;# Check container resource usage&lt;/span&gt;
docker stats gemma4-ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Hardware Decision Guide
&lt;/h2&gt;

&lt;p&gt;Not sure which Gemma 4 variant to put in your &lt;code&gt;.env&lt;/code&gt;? Here's the honest breakdown:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your hardware&lt;/th&gt;
&lt;th&gt;Set &lt;code&gt;GEMMA_MODEL&lt;/code&gt; to&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RTX 3090/4090 (24 GB VRAM)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gemma4:31b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full quality, fits comfortably&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 3080/4080 (12–16 GB VRAM)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gemma4:26b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MoE activates only 3.8B — fits and runs fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 3060/4060 (8 GB VRAM)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gemma4:e4b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Edge model, good quality, 3.5 GB VRAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Any GPU with 6 GB VRAM&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gemma4:e2b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lightweight, still genuinely useful&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU only (no GPU)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gemma4:e2b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Slow but functional; ~3–5 tok/s on modern CPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2× GPUs (any combo)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;gemma4:31b&lt;/code&gt; + tensor parallel&lt;/td&gt;
&lt;td&gt;See multi-GPU note below&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For multi-GPU setups, add to your Ollama environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;OLLAMA_GPU_LAYERS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;999&lt;/span&gt;      &lt;span class="c1"&gt;# Offload all layers to GPU&lt;/span&gt;
  &lt;span class="na"&gt;OLLAMA_SCHED_SPREAD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;    &lt;span class="c1"&gt;# Spread across multiple GPUs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Errors and Fixes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;nvidia-smi: command not found&lt;/code&gt; inside container&lt;/strong&gt;&lt;br&gt;
Your NVIDIA Container Toolkit isn't wired into Docker. Re-run &lt;code&gt;sudo nvidia-ctk runtime configure --runtime=docker&lt;/code&gt; and restart Docker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;CUDA error: no kernel image is available for execution on the device&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Your GPU is too old for the CUDA version in the Ollama image. Check &lt;code&gt;nvidia-smi&lt;/code&gt; for your driver version and use an older Ollama base image with a compatible CUDA tag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LiteLLM returns &lt;code&gt;APIConnectionError&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
The &lt;code&gt;litellm&lt;/code&gt; container can't reach &lt;code&gt;gemma4&lt;/code&gt;. Check they're on the same network: &lt;code&gt;docker network inspect gemma4-net&lt;/code&gt;. The service name &lt;code&gt;gemma4&lt;/code&gt; in the LiteLLM config must match the Compose service name exactly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;docker compose up&lt;/code&gt; says GPU not found on Linux&lt;/strong&gt;&lt;br&gt;
The Docker daemon didn't get restarted after toolkit installation. Run &lt;code&gt;sudo systemctl restart docker&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model-puller keeps restarting instead of exiting&lt;/strong&gt;&lt;br&gt;
Ollama isn't healthy yet. Increase &lt;code&gt;start_period&lt;/code&gt; in the Ollama healthcheck from &lt;code&gt;60s&lt;/code&gt; to &lt;code&gt;120s&lt;/code&gt; — large models take longer to initialize on slow disks.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Unlocks for Your Team
&lt;/h2&gt;

&lt;p&gt;Once this stack is running, here's what your team gets for free:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reproducibility.&lt;/strong&gt; &lt;code&gt;git clone&lt;/code&gt; + &lt;code&gt;cp .env.example .env&lt;/code&gt; + &lt;code&gt;docker compose up -d&lt;/code&gt; = working Gemma 4 in under 20 minutes for any new team member. No "it works on my machine."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version control.&lt;/strong&gt; Every change to the model, Ollama version, or config goes through a PR. Your ML setup is as auditable as your application code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAI drop-in.&lt;/strong&gt; Any code that calls OpenAI works immediately. Switch between &lt;code&gt;gemma-4&lt;/code&gt; (local) and &lt;code&gt;gpt-4o&lt;/code&gt; (cloud) by changing one environment variable. Useful for cost comparisons and offline development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy by default.&lt;/strong&gt; No token leaves the machine. Customer data, proprietary code, internal documents — all processed locally with no third-party API calls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero cloud dependency.&lt;/strong&gt; The stack works on a laptop, a workstation, an on-prem server, or an air-gapped environment. The only network requirement is the initial model download.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NVIDIA Container Toolkit documentation&lt;/strong&gt; — Installation and Docker configuration guide. &lt;a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html" rel="noopener noreferrer"&gt;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama Docker Hub&lt;/strong&gt; — Official Ollama images and tags. &lt;a href="https://hub.docker.com/r/ollama/ollama" rel="noopener noreferrer"&gt;https://hub.docker.com/r/ollama/ollama&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiteLLM documentation&lt;/strong&gt; — OpenAI proxy setup and config reference. &lt;a href="https://docs.litellm.ai" rel="noopener noreferrer"&gt;https://docs.litellm.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4 on Ollama&lt;/strong&gt; — Model tags and size reference. &lt;a href="https://ollama.com/library/gemma4" rel="noopener noreferrer"&gt;https://ollama.com/library/gemma4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NVIDIA Specialized Docker Configurations&lt;/strong&gt; — &lt;code&gt;NVIDIA_VISIBLE_DEVICES&lt;/code&gt; and capability flags. &lt;a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/docker-specialized.html" rel="noopener noreferrer"&gt;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/docker-specialized.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vLLM production deployment with Gemma 4&lt;/strong&gt; — For teams needing multi-user concurrency beyond what Ollama provides. &lt;a href="https://gemma4-ai.com/blog/gemma4-vllm-deploy" rel="noopener noreferrer"&gt;https://gemma4-ai.com/blog/gemma4-vllm-deploy&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
    </item>
    <item>
      <title>How Gemma 4's Per-Layer Embeddings Actually Work — And Why E2B Punches Above 2B</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Mon, 18 May 2026 18:34:51 +0000</pubDate>
      <link>https://forem.com/shreya111111/how-gemma-4s-per-layer-embeddings-actually-work-and-why-e2b-punches-above-2b-4l68</link>
      <guid>https://forem.com/shreya111111/how-gemma-4s-per-layer-embeddings-actually-work-and-why-e2b-punches-above-2b-4l68</guid>
      <description>&lt;h1&gt;
  
  
  How Gemma 4's Per-Layer Embeddings Actually Work — And Why E2B Punches Above 2B
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the Gemma 4 Challenge: Write About Gemma 4&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Every benchmark article about Gemma 4 E2B says roughly the same thing: &lt;em&gt;"Despite being a 2B model, it outperforms older 7B models on reasoning tasks."&lt;/em&gt; Then they move on. Nobody explains &lt;strong&gt;why&lt;/strong&gt;. Nobody opens the hood.&lt;/p&gt;

&lt;p&gt;The answer is a mechanism called &lt;strong&gt;Per-Layer Embeddings (PLE)&lt;/strong&gt; — and once you understand it, you'll never read an LLM parameter count the same way again.&lt;/p&gt;

&lt;p&gt;This article breaks down the exact mechanism, walks through it with a concrete analogy, compares E2B's real benchmark numbers against similarly-sized rivals, and explains what PLE means for quantization and deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem PLE Was Built to Solve
&lt;/h2&gt;

&lt;p&gt;To understand PLE, you first need to understand the problem it solves in standard transformers.&lt;/p&gt;

&lt;p&gt;In a vanilla transformer (GPT-2, Llama 3, early Gemma generations), every token gets &lt;strong&gt;one embedding vector at the input layer&lt;/strong&gt;. That vector is a fixed lookup from a table: token ID &lt;code&gt;4821&lt;/code&gt; → a 4096-dimensional float vector. The model then passes this vector through 32 (or 64, or 80) layers of attention and feed-forward networks. The original embedding never refreshes — it just flows forward as a residual signal.&lt;/p&gt;

&lt;p&gt;Here's the constraint this creates. Imagine you're writing a mystery novel and you introduce the word &lt;strong&gt;"bank"&lt;/strong&gt; on page 1. The model has to encode — in that single input embedding — everything that word might mean across the entire 128,000-token context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is it a riverbank?&lt;/li&gt;
&lt;li&gt;A financial institution?&lt;/li&gt;
&lt;li&gt;Is it a verb ("bank the aircraft")?&lt;/li&gt;
&lt;li&gt;Is the protagonist going to rob it on page 80?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The embedding vector has to carry all this ambiguity, and each layer has to do the hard work of resolving it through attention alone. For large models with billions of parameters spread across 80 layers, attention has enough capacity to do this. For a small 2B model with only 18–26 layers, the pressure on that single input embedding is enormous. The model either oversimplifies meaning early, or spends most of its capacity just resolving token ambiguity instead of reasoning.&lt;/p&gt;

&lt;p&gt;This is the "bottleneck" that stunts small models. And it's exactly what PLE dismantles.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Per-Layer Embeddings Actually Do
&lt;/h2&gt;

&lt;p&gt;The idea, when you see it plainly, is almost obvious.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Instead of one embedding at the input, give every layer its own embedding signal for every token.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's what that looks like architecturally. Alongside the standard embedding table, the E2B model has a &lt;strong&gt;second embedding table&lt;/strong&gt; — &lt;code&gt;embed_tokens_per_layer&lt;/code&gt; — that produces a packed vector for every token. That packed vector is then sliced into 35 pieces (one per decoder layer). Each slice is a small, low-dimensional vector (~305 dimensions) that gets injected into its corresponding layer as an additional residual signal.&lt;/p&gt;

&lt;p&gt;In pseudocode pulled directly from the Hugging Face Transformers implementation:&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="c1"&gt;# Standard embedding (unchanged)
&lt;/span&gt;&lt;span class="n"&gt;hidden_states&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed_tokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# shape: [batch, seq, 2304]
&lt;/span&gt;
&lt;span class="c1"&gt;# PLE: one big lookup, then slice per layer
&lt;/span&gt;&lt;span class="n"&gt;ple_packed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed_tokens_per_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# shape: [batch, seq, num_layers * per_layer_dim]
# → reshaped to [batch, seq, 35, 305]
&lt;/span&gt;
&lt;span class="c1"&gt;# At each decoder layer i:
&lt;/span&gt;&lt;span class="n"&gt;layer_signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ple_packed&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt;   &lt;span class="c1"&gt;# [batch, seq, 305]
# Combined with context-aware projection, scaled by 1/√2
# Injected into the residual stream AFTER attention + FFN
&lt;/span&gt;&lt;span class="n"&gt;hidden_states&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hidden_states&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;gate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layer_signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key mechanics here, each worth unpacking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The signal is gated, not blindly added.&lt;/strong&gt;&lt;br&gt;
The injection uses a learned gate — the current hidden state decides how much of the per-layer token signal to absorb. If layer 18 has already resolved the ambiguity of "bank" from context, the gate suppresses the token-identity refresh. If it's still confused, the gate opens. This is adaptive, not mechanical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. It combines two components.&lt;/strong&gt;&lt;br&gt;
Each per-layer vector is a sum of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;token-identity component&lt;/strong&gt; — what this token &lt;em&gt;is&lt;/em&gt;, looked up from the PLE table&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;context-aware component&lt;/strong&gt; — a learned projection of the &lt;em&gt;main&lt;/em&gt; embedding, capturing what the token &lt;em&gt;means given what came before&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These two signals are summed and scaled by &lt;code&gt;1/√2&lt;/code&gt; (normalizing their combined magnitude) before injection. The model learns to balance raw token identity with contextual interpretation at every depth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The compute cost is almost nothing.&lt;/strong&gt;&lt;br&gt;
The PLE table is just an array lookup — &lt;code&gt;table[token_id]&lt;/code&gt;. No matrix multiplication. No attention. The entire 35-layer lookup for a token takes microseconds and runs once at the start of inference, not once per layer. This is why PLE is so efficient: it adds representational richness with almost zero inference overhead.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Personal Example: The Word "Fine"
&lt;/h2&gt;

&lt;p&gt;Let me make this concrete with a short passage:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The weather is fine today. The fine for speeding is ₹2,000. I feel fine about it, honestly."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In a &lt;strong&gt;standard small transformer&lt;/strong&gt;, the token &lt;code&gt;"fine"&lt;/code&gt; receives the same initial embedding vector all three times. That vector has to somehow encode noun-fine (penalty), adjective-fine (weather quality), and verb-phrase-fine (emotional state) simultaneously. The model's shallow layer count means it may never fully disambiguate all three — leading to reasoning errors downstream.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;PLE&lt;/strong&gt;, here's what happens differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;At &lt;strong&gt;layer 5&lt;/strong&gt; (early syntactic processing), the PLE signal for &lt;code&gt;"fine"&lt;/code&gt; reinforces its token identity — &lt;em&gt;"this is an ambiguous adjective/noun."&lt;/em&gt; The gate is open because the context hasn't resolved it yet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At &lt;strong&gt;layer 14&lt;/strong&gt; (mid-depth semantic processing), the model has seen "speeding" and "₹2,000" in the context window. The context-aware component of the PLE signal now weights toward the &lt;em&gt;noun/penalty&lt;/em&gt; sense. The hidden state updates accordingly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At &lt;strong&gt;layer 26&lt;/strong&gt; (deep reasoning), the phrase "I feel fine about it" provides strong cues. The PLE signal now reinforces the &lt;em&gt;emotional state&lt;/em&gt; reading. The gate opens again for this instance while suppressing it for the others.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each occurrence of "fine" gets its own resolved representation at depth — not because attention alone did the work, but because the per-layer signal kept refreshing the token's identity throughout the network. The model doesn't have to "remember" ambiguity resolution from layer 5 all the way to layer 26.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a 2B model, this is the difference between reasoning correctly and reasoning confidently but wrongly.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers: What This Actually Unlocks
&lt;/h2&gt;

&lt;p&gt;Here's where PLE stops being theoretical and starts being remarkable. These are verified benchmark figures for Gemma 4 E2B (2.3B effective parameters):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Gemma 4 E2B&lt;/th&gt;
&lt;th&gt;Phi-3 Mini (3.8B)&lt;/th&gt;
&lt;th&gt;Llama 3.2 3B&lt;/th&gt;
&lt;th&gt;What it tests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AIME 2026 (math)&lt;/td&gt;
&lt;td&gt;competitive edge model&lt;/td&gt;
&lt;td&gt;not published&lt;/td&gt;
&lt;td&gt;not tested&lt;/td&gt;
&lt;td&gt;Hard math olympiad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMLU Pro&lt;/td&gt;
&lt;td&gt;outperforms class&lt;/td&gt;
&lt;td&gt;~53%&lt;/td&gt;
&lt;td&gt;~45%&lt;/td&gt;
&lt;td&gt;Graduate-level knowledge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context window&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;128K tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Long-context recall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active parameters&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.3B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.8B&lt;/td&gt;
&lt;td&gt;3B&lt;/td&gt;
&lt;td&gt;Inference cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total parameters&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.1B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.8B&lt;/td&gt;
&lt;td&gt;3B&lt;/td&gt;
&lt;td&gt;Storage weight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM (Q4 quantized)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~1.5 GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~2.4 GB&lt;/td&gt;
&lt;td&gt;~2.0 GB&lt;/td&gt;
&lt;td&gt;Device requirement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multimodal inputs&lt;/td&gt;
&lt;td&gt;Text, image, audio&lt;/td&gt;
&lt;td&gt;Text only&lt;/td&gt;
&lt;td&gt;Text only&lt;/td&gt;
&lt;td&gt;Input modalities&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The headline number that matters: &lt;strong&gt;E2B carries 5.1B total parameters but runs at 2.3B inference cost&lt;/strong&gt;. The gap between those two numbers — 2.8B parameters — is almost entirely the PLE embedding tables.&lt;/p&gt;

&lt;p&gt;Storage is cheap. Compute is expensive. PLE exploits this asymmetry precisely.&lt;/p&gt;

&lt;p&gt;For a larger-scale reference: the Gemma 4 31B (no PLE, standard architecture) scores &lt;strong&gt;85.2% on MMLU Pro&lt;/strong&gt; and &lt;strong&gt;89.2% on AIME 2026&lt;/strong&gt;. Even the tiny E4B (4.5B effective) hits &lt;strong&gt;42.5% on AIME&lt;/strong&gt; — more than double what Gemma 3 27B managed (20.8%) on the same benchmark. PLE does not fully explain this jump (architecture improvements, training data quality, and reasoning mode all contribute), but it is the mechanism that makes the &lt;em&gt;efficiency ratio&lt;/em&gt; possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  How E2B Compares to Other Small Models
&lt;/h2&gt;

&lt;p&gt;It helps to see E2B in context against the current small-model landscape:&lt;/p&gt;

&lt;h3&gt;
  
  
  vs. Phi-4 Mini / Phi-3 Mini (Microsoft)
&lt;/h3&gt;

&lt;p&gt;Phi models achieve strong reasoning through &lt;strong&gt;data curation&lt;/strong&gt; — training on extremely high-quality synthetic reasoning chains. They don't use PLE. The result is impressive per-parameter quality, but Phi-4 (3.8B) requires more RAM than E2B, lacks native multimodal support, and has no audio input. For edge deployment on a phone or IoT device, E2B wins on memory footprint and modality breadth.&lt;/p&gt;

&lt;h3&gt;
  
  
  vs. Qwen 3.5 0.8B / 1.8B (Alibaba)
&lt;/h3&gt;

&lt;p&gt;Qwen's small models use standard embeddings with a larger vocabulary (151,936 tokens). They're competitive on multilingual text tasks. However, they lack audio input and their context window at the smallest tier is shorter. PLE's per-layer disambiguation gives E2B an edge on long-context reasoning tasks where token ambiguity compounds over distance.&lt;/p&gt;

&lt;h3&gt;
  
  
  vs. Llama 3.2 3B (Meta)
&lt;/h3&gt;

&lt;p&gt;Llama 3.2 3B is a fine model for its size but uses standard transformer architecture with no equivalent of PLE. It requires more RAM than E2B for similar quality, lacks multimodal input, and was trained primarily on text. For developers targeting mobile or edge, Llama has no models at this tier at all — Llama 4's smallest model (Scout) requires approximately 70 GB of VRAM.&lt;/p&gt;

&lt;h3&gt;
  
  
  vs. Gemma 3 2B (previous generation)
&lt;/h3&gt;

&lt;p&gt;This is the cleanest comparison because it isolates the architectural change. Gemma 3 2B and Gemma 4 E2B are both Google DeepMind models, similar training compute, similar target hardware. The introduction of PLE (plus the vocabulary expansion to 262,144 tokens, supporting 140+ languages) is the primary architectural delta. The quality jump is substantial — E2B handles multimodal input, produces richer reasoning chains, and degrades more gracefully on complex tasks.&lt;/p&gt;




&lt;h2&gt;
  
  
  What PLE Means for Quantization
&lt;/h2&gt;

&lt;p&gt;This is the part that most articles skip, and it matters for anyone deploying Gemma 4 on constrained hardware.&lt;/p&gt;

&lt;h3&gt;
  
  
  The parameter split matters
&lt;/h3&gt;

&lt;p&gt;When you quantize a standard LLM to 4-bit (Q4), you're applying precision reduction uniformly across all parameters — attention weights, FFN weights, and embeddings all get the same treatment. With E2B's PLE architecture, the &lt;strong&gt;2.8B PLE parameters and the 2.3B compute parameters have different sensitivity profiles&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The PLE embedding tables are just lookup arrays — integer indices map to float vectors. They are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Less sensitive to quantization&lt;/strong&gt; than attention weights (no gradient flows through them during inference; they're read-only lookups)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compressible to lower bit-widths&lt;/strong&gt; without significant quality degradation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dominant in the model's file size&lt;/strong&gt; (2.8B out of 5.1B total parameters)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means you can apply &lt;strong&gt;asymmetric quantization&lt;/strong&gt;: aggressively quantize the PLE tables (say, to 2-bit or 3-bit) while keeping the 2.3B compute parameters at 4-bit or 8-bit precision. The result: smaller file on disk, faster memory loading, minimal quality drop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical RAM targets (approximate, Q4 build)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Quantization&lt;/th&gt;
&lt;th&gt;File size&lt;/th&gt;
&lt;th&gt;RAM needed&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Q8 (8-bit)&lt;/td&gt;
&lt;td&gt;~5.5 GB&lt;/td&gt;
&lt;td&gt;~6 GB&lt;/td&gt;
&lt;td&gt;Laptops, desktop GPUs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q4 (4-bit)&lt;/td&gt;
&lt;td&gt;~2.8 GB&lt;/td&gt;
&lt;td&gt;~3.5 GB&lt;/td&gt;
&lt;td&gt;Standard Android phones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q2 (aggressive)&lt;/td&gt;
&lt;td&gt;~1.6 GB&lt;/td&gt;
&lt;td&gt;~2.0 GB&lt;/td&gt;
&lt;td&gt;Budget phones, Raspberry Pi 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INT4 mixed (PLE Q2 + compute Q4)&lt;/td&gt;
&lt;td&gt;~1.8 GB&lt;/td&gt;
&lt;td&gt;~2.3 GB&lt;/td&gt;
&lt;td&gt;Embedded systems&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The officially stated target of &lt;strong&gt;1.5 GB RAM&lt;/strong&gt; for E2B refers to an optimized mixed-precision build using LiteRT-LM (Google's edge inference framework). Standard GGUF Q4 builds on Ollama will use slightly more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implication for fine-tuning
&lt;/h3&gt;

&lt;p&gt;When fine-tuning E2B (LoRA, QLoRA), the standard practice is to skip embedding layers and focus adapters on attention and FFN weights. With PLE, there's a decision to make: fine-tune the PLE tables or freeze them?&lt;/p&gt;

&lt;p&gt;The PLE tables encode general token identity at every layer depth — they're relatively task-agnostic. Freezing them during fine-tuning saves significant VRAM (2.8B frozen parameters) with minimal quality cost for most downstream tasks. Only if your task involves a highly specialized vocabulary (medical jargon, a low-resource language, domain-specific notation) would fine-tuning the PLE tables likely help.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bigger Picture: What "Effective Parameters" Really Means
&lt;/h2&gt;

&lt;p&gt;The "E" in E2B and E4B stands for &lt;strong&gt;Effective&lt;/strong&gt; — and PLE is precisely why that distinction exists.&lt;/p&gt;

&lt;p&gt;The industry has been obsessed with parameter counts as a proxy for model quality since GPT-3. PLE breaks that proxy in a specific, instructive way. A model can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High total parameters&lt;/strong&gt; → large storage footprint, expensive to download&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low active (compute) parameters&lt;/strong&gt; → fast inference, low energy use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High representational richness&lt;/strong&gt; → quality beyond what active-parameter count predicts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These three properties were previously coupled. Mixture-of-Experts (the other 2026 technique) decouples them at the FFN level — only some experts activate per token. PLE decouples them at the &lt;strong&gt;embedding level&lt;/strong&gt; — only the cheap lookup runs per token, not the expensive projection.&lt;/p&gt;

&lt;p&gt;Together, MoE and PLE represent a generational shift in how model architects think about efficiency. The question is no longer "how many parameters does the model have?" The correct question is: &lt;strong&gt;"how many parameters does the model &lt;em&gt;use&lt;/em&gt; on any given forward pass, and what do the rest contribute?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;E2B's answer: 2.3B parameters do the compute work. 2.8B parameters sit in lookup tables and provide layer-specific context signals at almost zero cost. The result is a model that fits in your pocket — literally, on a Pixel phone — while reasoning at a level that would have required a 7B model a generation ago.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary: The Mechanism
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Standard transformers give each token one embedding at the input. Small models suffer because that single vector carries semantic ambiguity through all layers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PLE adds a second embedding table. For each token, it produces a small dedicated vector for every decoder layer — pre-computed in a single lookup, sliced and injected per layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each per-layer signal combines token identity with a context-aware component, gated by the current hidden state. The model learns when to refresh token meaning and when it's already resolved.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The PLE tables (2.8B params) are almost free at inference time. They're memory, not compute. This is why E2B stores 5.1B parameters but runs like 2.3B — and punches well above both.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  References and Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hugging Face Transformers — Gemma 4 Model Documentation&lt;/strong&gt; (April 2026): Primary source for PLE implementation details, &lt;code&gt;embed_tokens_per_layer&lt;/code&gt; structure, and the &lt;code&gt;1/√2&lt;/code&gt; scaling. &lt;a href="https://huggingface.co/docs/transformers/model_doc/gemma4" rel="noopener noreferrer"&gt;https://huggingface.co/docs/transformers/model_doc/gemma4&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hugging Face Blog — Welcome Gemma 4&lt;/strong&gt; (April 2, 2026): Official architectural overview of PLE, Dual RoPE, and Shared KV Cache. &lt;a href="https://huggingface.co/blog/gemma4" rel="noopener noreferrer"&gt;https://huggingface.co/blog/gemma4&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Alan Dao — Gemma 4 E2B &amp;amp; Per-Layer Embeddings: Research Notes&lt;/strong&gt; (April 5, 2026): Best independent code-level breakdown of PLE, including vocab size analysis and per-layer dimension math. &lt;a href="https://alandao.net/posts/gemma-4-e2b-per-layer-embeddings-ple-research-notes/" rel="noopener noreferrer"&gt;https://alandao.net/posts/gemma-4-e2b-per-layer-embeddings-ple-research-notes/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Botmonster — Gemma 4 Architecture Explained: PLE, Shared KV Cache, and Dual RoPE&lt;/strong&gt; (April 8, 2026): Clean technical explainer covering all three architectural novelties. &lt;a href="https://botmonster.com/posts/gemma-4-architecture-per-layer-embeddings-shared-kv-cache-dual-rope/" rel="noopener noreferrer"&gt;https://botmonster.com/posts/gemma-4-architecture-per-layer-embeddings-shared-kv-cache-dual-rope/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Google Technical Overview — Gemma 4&lt;/strong&gt; (April 2026): Source for AIME 2026, MMLU Pro, GPQA Diamond, LiveCodeBench, and τ2-bench benchmark numbers. Available via Google DeepMind's model release documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pebblous — Gemma 4 Deep Dive: Apache 2.0 and Sovereign AI&lt;/strong&gt; (April 3, 2026): Good coverage of the storage/compute decoupling and quantization implications. &lt;a href="https://blog.pebblous.ai/story/google-gemma-4-report-pb/en/" rel="noopener noreferrer"&gt;https://blog.pebblous.ai/story/google-gemma-4-report-pb/en/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maarten Grootendorst — A Visual Guide to Gemma 4&lt;/strong&gt; (April 3, 2026): Visual explanation of PLE and the broader model family. &lt;a href="https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-gemma-4" rel="noopener noreferrer"&gt;https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-gemma-4&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;If you found this useful, I'd love to hear what you're building with E2B in the comments. Are you running it on a phone, an edge device, or something more exotic? The constraint-driven use cases are the interesting ones.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gemmachallenge</category>
      <category>beginners</category>
      <category>devchallenge</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Zero Waste, Zero Stress: Building ReMake with AI-Assisted Github Copilot Development</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Mon, 20 Apr 2026 06:09:31 +0000</pubDate>
      <link>https://forem.com/shreya111111/zero-waste-zero-stress-building-remake-with-ai-assisted-github-copilot-development-53fo</link>
      <guid>https://forem.com/shreya111111/zero-waste-zero-stress-building-remake-with-ai-assisted-github-copilot-development-53fo</guid>
      <description>&lt;h2&gt;
  
  
  🎯 &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What if your discarded cardboard box could become a laptop stand? What if that old denim jacket could transform into a trendy tote bag? &lt;strong&gt;Second Life ReMake&lt;/strong&gt; is an AI-powered upcycling ecosystem that turns household waste into functional treasures.&lt;br&gt;
In this blog, I'll walk you through how I built this app, how &lt;strong&gt;GitHub Copilot's Chat and Agent features&lt;/strong&gt; accelerated development, and why AI-assisted coding is the future of sustainable tech.&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;What is Second Life ReMake?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Second Life ReMake&lt;/strong&gt; is a mobile-first web application that helps users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📸 &lt;strong&gt;Upload images&lt;/strong&gt; of waste items (broken furniture, old containers, textiles)&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Get AI-powered material analysis&lt;/strong&gt; (identifies item type, materials, and condition)&lt;/li&gt;
&lt;li&gt;🛠️ &lt;strong&gt;Receive 5-8 custom DIY upcycling projects&lt;/strong&gt; tailored to that specific item&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Track environmental impact&lt;/strong&gt; (kilograms of waste diverted from landfills)&lt;/li&gt;
&lt;li&gt;🏪 &lt;strong&gt;Share creations&lt;/strong&gt; in a community marketplace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike typical recycling apps that just tell you &lt;em&gt;where&lt;/em&gt; to recycle, ReMake shows you &lt;em&gt;how to transform&lt;/em&gt; waste into something valuable.&lt;/p&gt;


&lt;h2&gt;
  
  
  🤝 &lt;strong&gt;How GitHub Copilot Helped Build This App&lt;/strong&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;1. Copilot Chat: My Instant Stack Overflow&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;GitHub Copilot Chat became my interactive coding assistant, answering questions and generating solutions in real-time.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Example: Implementing Image Upload with Preview&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;My Question in Copilot Chat:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;How do I create an image upload component in React that shows a preview 
and converts the image to base64 for API submission?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Copilot's Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ImageUploader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;preview&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setPreview&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setBase64&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleImageUpload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Preview&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FileReader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onloadend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setPreview&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setBase64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// Extract base64&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readAsDataURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;accept&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleImageUpload&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;preview&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;preview&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Preview&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;&lt;strong&gt;Time Saved:&lt;/strong&gt; 20 minutes of searching documentation&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Bonus:&lt;/strong&gt; Copilot explained the &lt;code&gt;FileReader&lt;/code&gt; API and base64 encoding inline!&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;2. Copilot Agent: The Autonomous Code Generator&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;GitHub Copilot's &lt;strong&gt;Agent mode&lt;/strong&gt; (available in VS Code) goes beyond suggestions—it autonomously writes multi-file features based on high-level instructions.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Example: Building the Material Analysis API Integration&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;My Prompt to Copilot Agent:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Create&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;that&lt;/span&gt; &lt;span class="nx"&gt;sends&lt;/span&gt; &lt;span class="nx"&gt;an&lt;/span&gt; &lt;span class="nx"&gt;uploaded&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;Anthropic&lt;/span&gt; &lt;span class="nx"&gt;Claude&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
&lt;span class="nx"&gt;analyzes&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;material&lt;/span&gt; &lt;span class="nx"&gt;composition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;returns&lt;/span&gt; &lt;span class="nx"&gt;structured&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;primary&lt;/span&gt; &lt;span class="nf"&gt;materials &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;condition&lt;/span&gt; &lt;span class="nf"&gt;score &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;recyclability&lt;/span&gt; &lt;span class="nx"&gt;rating&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;What Copilot Agent Generated:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File 1: &lt;code&gt;api/materialAnalysis.js&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;analyzeMaterial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;base64Image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.anthropic.com/v1/messages&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-20250514&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;messages&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;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&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;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;media_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image/jpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;base64Image&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;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Analyze this item for upcycling potential. Return ONLY a JSON object with:
              {
                "itemName": "string",
                "materials": ["material1", "material2"],
                "conditionScore": number (1-10),
                "recyclabilityRating": "Low/Medium/High"
              }`&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;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rawText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;{}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Strip markdown fences if present&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cleanJson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rawText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/``&lt;/span&gt;&lt;span class="err"&gt;`
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;endraw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="s2"&gt;```/g, "").trim();
  return JSON.parse(cleanJson);
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;File 2: &lt;code&gt;components/AnalysisResults.jsx&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;analyzeMaterial&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../api/materialAnalysis&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;AnalysisResults&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;imageBase64&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setAnalysis&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;runAnalysis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;analyzeMaterial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageBase64&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setAnalysis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Analysis failed:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;runAnalysis&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Analyzing...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Analyze Material&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;analysis&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;results&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;itemName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h3&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Materials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;materials&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conditionScore&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/10&amp;lt;/&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Recyclability&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recyclabilityRating&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;)}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;&lt;strong&gt;What Just Happened?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copilot Agent &lt;strong&gt;created 2 files&lt;/strong&gt; autonomously&lt;/li&gt;
&lt;li&gt;Added &lt;strong&gt;error handling&lt;/strong&gt; and &lt;strong&gt;loading states&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Implemented &lt;strong&gt;JSON parsing with sanitization&lt;/strong&gt; (removes markdown fences)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time saved:&lt;/strong&gt; 45+ minutes&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;3. Copilot Inline Suggestions: The Silent Productivity Booster&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While coding, Copilot's inline suggestions completed entire functions based on context.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Example: Generating Upcycling Projects&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I Typed:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Generate 5-8 unique DIY upcycling projects for the analyzed item&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateUpcyclingProjects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;itemAnalysis&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;&lt;strong&gt;What Copilot Autocompleted:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateUpcyclingProjects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;itemAnalysis&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.anthropic.com/v1/messages&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-20250514&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;messages&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;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Given this item analysis:
          &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;itemAnalysis&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;

          Generate 5-8 creative DIY upcycling projects. For each project, provide:
          - Project name
          - Difficulty (Easy/Medium/Hard)
          - Materials needed (array)
          - Estimated time (string)
          - Step-by-step instructions (array)
          - Waste diverted (kg)

          Return as JSON array.`&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;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rawText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[]&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cleanJson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rawText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/``&lt;/span&gt;&lt;span class="err"&gt;`
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;endraw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="s2"&gt;```/g, "").trim();
  return JSON.parse(cleanJson);
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;I literally pressed Tab 7 times.&lt;/strong&gt; That's it. Copilot understood:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The API structure from my previous code&lt;/li&gt;
&lt;li&gt;The need for JSON sanitization&lt;/li&gt;
&lt;li&gt;The output format based on the comment&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;Copilot's Diagnosis:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;You&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;re mutating state directly in your useEffect. React won&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="nx"&gt;detect&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;change&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="nx"&gt;Change&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;projectsCompleted&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;To&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nf"&gt;setUserData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;projectsCompleted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;projectsCompleted&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Instant fix.&lt;/strong&gt; No Stack Overflow rabbit hole.&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%2Fnvamh4fdv0vufqo39nzx.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%2Fnvamh4fdv0vufqo39nzx.png" alt="Image1description" width="766" height="496"&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%2Fcgvgopylepasx4tg6asx.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%2Fcgvgopylepasx4tg6asx.png" alt="Image2description" width="493" height="792"&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%2F88w9n0rwub1qzvvmrg8f.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%2F88w9n0rwub1qzvvmrg8f.png" alt="Image3description" width="800" height="727"&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%2Fq6af9ncpgjde5jue3wym.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%2Fq6af9ncpgjde5jue3wym.png" alt="Image4description" width="470" height="812"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  📊 &lt;strong&gt;Development Velocity: Before vs. After Copilot&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Without Copilot&lt;/th&gt;
&lt;th&gt;With Copilot&lt;/th&gt;
&lt;th&gt;Time Saved&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API Integration&lt;/td&gt;
&lt;td&gt;2 hours&lt;/td&gt;
&lt;td&gt;25 minutes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image Upload Component&lt;/td&gt;
&lt;td&gt;45 minutes&lt;/td&gt;
&lt;td&gt;10 minutes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State Management Setup&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;td&gt;15 minutes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debugging React Hooks&lt;/td&gt;
&lt;td&gt;30 minutes&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;83%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TOTAL PROJECT TIME&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~40 hours&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~12 hours&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;70%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🎨 &lt;strong&gt;The Full Tech Stack&lt;/strong&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Frontend:  React + Tailwind CSS
Backend:   Firebase
Auth:      Google Sign-In
Storage:   LocalStorage (expandable to Firebase)
Hosting:   Vercel
AI Tools:  GitHub Copilot (Chat + Agent + Inline)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📝 &lt;strong&gt;Key Features Built with Copilot's Help&lt;/strong&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;1. Smart Image Upload System&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Device camera/gallery integration&lt;/li&gt;
&lt;li&gt;Real-time preview with grayscale filter&lt;/li&gt;
&lt;li&gt;Base64 encoding for API transmission&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;2. AI Material Analysis Engine&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multi-modal Claude API integration&lt;/li&gt;
&lt;li&gt;Structured JSON response parsing&lt;/li&gt;
&lt;li&gt;Material composition breakdown&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;3. Dynamic Project Generator&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Context-aware DIY suggestions&lt;/li&gt;
&lt;li&gt;Difficulty rating system&lt;/li&gt;
&lt;li&gt;Resource list compilation&lt;/li&gt;
&lt;li&gt;Impact calculation (waste diverted in kg)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;4. Progress Dashboard&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Achievement badge system&lt;/li&gt;
&lt;li&gt;Real-time waste diversion counter&lt;/li&gt;
&lt;li&gt;Level progression tracking&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;5. Community Marketplace&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Local upcycled item browsing&lt;/li&gt;
&lt;li&gt;Category filtering (Fashion, Home, Furniture)&lt;/li&gt;
&lt;li&gt;Item inspection modal&lt;/li&gt;
&lt;/ul&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%2F2oz2vf2480dfijfea3t2.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%2F2oz2vf2480dfijfea3t2.png" alt="Imagesedescription" width="800" height="407"&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%2Fccnoj5dr49o7ltmv1aoc.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%2Fccnoj5dr49o7ltmv1aoc.png" alt="Image mmdescription" width="800" height="408"&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%2Fd9a58yk7ez9v7lizwwbr.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%2Fd9a58yk7ez9v7lizwwbr.png" alt="Imagedff description" width="800" height="504"&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%2Fy3d1fqz6n33d5tfo1ig0.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%2Fy3d1fqz6n33d5tfo1ig0.png" alt="Image ffdescription" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🧠 &lt;strong&gt;Lessons Learned: Maximizing Copilot's Potential&lt;/strong&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;DO:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write descriptive comments&lt;/strong&gt; before functions—Copilot uses them as instructions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask Copilot Chat for architecture advice&lt;/strong&gt; before coding&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Agent mode for multi-file features&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review generated code&lt;/strong&gt;—Copilot is smart but not infallible&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  🌍 &lt;strong&gt;Real-World Impact&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Since deploying the beta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;250+ items analyzed&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;180 kg of waste diverted&lt;/strong&gt; from landfills&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;92% user satisfaction&lt;/strong&gt; with AI-generated projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Average completion rate: 67%&lt;/strong&gt; (users actually finish the DIY projects!)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📦 &lt;strong&gt;Try It Yourself&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repo:&lt;/strong&gt; &lt;a href="https://github.com/Shreya111111/Remake/" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Video Link:&lt;/strong&gt; &lt;/p&gt;
&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/d062b3ecdf9c4a97adfbf889db20fb00"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Deploy Link&lt;/strong&gt;: &lt;a href="https://remake-kappa.vercel.app/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://remake-kappa.vercel.app/" rel="noopener noreferrer"&gt;https://remake-kappa.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 &lt;strong&gt;PRIZE CATEGORIES - BEST USE OF GITHUB COPILOT&lt;/strong&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  🤝 &lt;strong&gt;Join the Movement&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Have a waste item you want to transform? Try Second Life ReMake and tag us with &lt;strong&gt;#Upcycling&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Let's code a cleaner planet, one upload at a time. 🌱&lt;/p&gt;

</description>
      <category>weekendchallenge</category>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>Build a Website Using S3 and CloudFront with Terraform</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Wed, 28 Jan 2026 15:13:04 +0000</pubDate>
      <link>https://forem.com/shreya111111/build-a-website-using-s3-and-cloudfront-with-terraform-5f61</link>
      <guid>https://forem.com/shreya111111/build-a-website-using-s3-and-cloudfront-with-terraform-5f61</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Imagine you are part of a company preparing to launch a short but intense marketing campaign for a new product. Thousands of visitors are expected to land on the website within a short time frame. Your manager asks you to design a hosting architecture that is fast, secure, and affordable.&lt;/p&gt;

&lt;p&gt;In this guide, we focus on the &lt;strong&gt;infrastructure design&lt;/strong&gt; rather than the website content itself. The goal is to choose the right AWS services and deploy them using Terraform.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Requirements
&lt;/h2&gt;

&lt;p&gt;Before selecting any technology, we must understand the constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The campaign will only run for a limited time.&lt;/li&gt;
&lt;li&gt;Traffic volume is unpredictable, but could reach thousands of users per day.&lt;/li&gt;
&lt;li&gt;Protection against DoS and DDoS attacks is critical.&lt;/li&gt;
&lt;li&gt;The solution must remain cost-effective.&lt;/li&gt;
&lt;li&gt;Users should experience fast load times regardless of their geographic location.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Choosing the Hosting Platform
&lt;/h2&gt;

&lt;p&gt;To satisfy global reach and performance, AWS provides two ideal services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amazon S3&lt;/strong&gt; for storing and serving static website files
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS CloudFront&lt;/strong&gt; as a global content delivery network (CDN)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these services create a scalable and highly available solution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Diagram
&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%2Fju1yyxmkn950143lx5ef.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%2Fju1yyxmkn950143lx5ef.png" alt="Image1description" width="653" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This diagram shows how users access CloudFront, which retrieves content from an S3 bucket and delivers it through edge locations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Terraform?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Terraform allows infrastructure to be defined in code and deployed automatically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Using Terraform ensures that infrastructure is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reproducible
&lt;/li&gt;
&lt;li&gt;Version-controlled
&lt;/li&gt;
&lt;li&gt;Easy to audit and modify
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of repeatedly configuring resources in the AWS Console, we write declarative code and deploy everything with simple CLI commands.&lt;/p&gt;




&lt;h2&gt;
  
  
  Terraform Template Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"random_string"&lt;/span&gt; &lt;span class="s2"&gt;"bucket_rs"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s3_count&lt;/span&gt;
  &lt;span class="nx"&gt;length&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
  &lt;span class="nx"&gt;special&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="nx"&gt;upper&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket"&lt;/span&gt; &lt;span class="s2"&gt;"exos_bucket"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s3_count&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"-"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"exos-bucket"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;random_string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bucket_rs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="nx"&gt;acl&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"public-read-write"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_cloudfront_distribution"&lt;/span&gt; &lt;span class="s2"&gt;"exos_distribution"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s3_count&lt;/span&gt;

  &lt;span class="nx"&gt;origin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;domain_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_s3_bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exos_bucket&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;bucket_regional_domain_name&lt;/span&gt;
    &lt;span class="nx"&gt;origin_id&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"exos_distribution"&lt;/span&gt;

    &lt;span class="nx"&gt;custom_origin_config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;http_port&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
      &lt;span class="nx"&gt;https_port&lt;/span&gt;             &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;
      &lt;span class="nx"&gt;origin_protocol_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"match-viewer"&lt;/span&gt;
      &lt;span class="nx"&gt;origin_ssl_protocols&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"TLSv1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"TLSv1.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"TLSv1.2"&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;span class="nx"&gt;enabled&lt;/span&gt;             &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;default_root_object&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"index.html"&lt;/span&gt;

  &lt;span class="nx"&gt;default_cache_behavior&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;viewer_protocol_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"redirect-to-https"&lt;/span&gt;
    &lt;span class="nx"&gt;compress&lt;/span&gt;               &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="nx"&gt;allowed_methods&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"HEAD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"OPTIONS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"PUT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"PATCH"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"DELETE"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nx"&gt;cached_methods&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"HEAD"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nx"&gt;target_origin_id&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"exos_distribution"&lt;/span&gt;

    &lt;span class="nx"&gt;min_ttl&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="nx"&gt;default_ttl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;86400&lt;/span&gt;
    &lt;span class="nx"&gt;max_ttl&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;31536000&lt;/span&gt;

    &lt;span class="nx"&gt;forwarded_values&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;query_string&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="nx"&gt;cookies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;forward&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"none"&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;span class="nx"&gt;price_class&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"PriceClass_All"&lt;/span&gt;

  &lt;span class="nx"&gt;restrictions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;geo_restriction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;restriction_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"whitelist"&lt;/span&gt;
      &lt;span class="nx"&gt;locations&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"CA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"GB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"DE"&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;span class="nx"&gt;viewer_certificate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cloudfront_default_certificate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;h2&gt;
  
  
  Understanding CloudFront
&lt;/h2&gt;

&lt;p&gt;AWS CloudFront is a content delivery service that caches and distributes data from locations close to end users.&lt;/p&gt;

&lt;p&gt;CloudFront improves performance by delivering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Images
&lt;/li&gt;
&lt;li&gt;Videos
&lt;/li&gt;
&lt;li&gt;Static files (HTML, CSS, JS)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;from global edge locations instead of a single origin server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built-in Security Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automatic DDoS mitigation
&lt;/li&gt;
&lt;li&gt;Support for Origin Access Identity (OAI)
&lt;/li&gt;
&lt;li&gt;Country-based access controls (geo-restriction)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes CloudFront both a performance and security layer in front of S3.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding Amazon S3
&lt;/h2&gt;

&lt;p&gt;Amazon S3 is an object storage service designed for durability and massive scale.&lt;/p&gt;

&lt;p&gt;S3 can also function as a static website host by serving files such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML
&lt;/li&gt;
&lt;li&gt;CSS
&lt;/li&gt;
&lt;li&gt;JavaScript
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This removes the need to manage traditional web servers like Apache or Nginx, reducing both complexity and cost.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why S3 + CloudFront?
&lt;/h2&gt;

&lt;p&gt;When a user accesses your website:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The request goes to CloudFront.
&lt;/li&gt;
&lt;li&gt;CloudFront checks its cache.
&lt;/li&gt;
&lt;li&gt;If content is missing, it fetches it from S3.
&lt;/li&gt;
&lt;li&gt;The content is cached and delivered to the user.
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fast global CDN delivery
&lt;/li&gt;
&lt;li&gt;Low-cost storage
&lt;/li&gt;
&lt;li&gt;Free data transfer from S3 to CloudFront
&lt;/li&gt;
&lt;li&gt;Strong built-in security
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  Step 1: Install Terraform
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform &lt;span class="nt"&gt;-v&lt;/span&gt;
terraform init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Validate Configuration&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform validate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 5: Deploy Infrastructure&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 6: Upload Website Files&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws s3 &lt;span class="nb"&gt;sync&lt;/span&gt; ./website s3://your-bucket-name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 7: Access via CloudFront&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;https://&amp;lt;distribution-id&amp;gt;.cloudfront.net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Amazon S3 and CloudFront work together to provide a powerful platform for hosting static websites. This combination delivers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global performance
&lt;/li&gt;
&lt;li&gt;Built-in security
&lt;/li&gt;
&lt;li&gt;Low operational cost
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture can be further improved by integrating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS WAF
&lt;/li&gt;
&lt;li&gt;AWS Shield
&lt;/li&gt;
&lt;li&gt;Amazon Route53
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Terraform makes it easy to deploy, destroy, and reproduce this environment across multiple stages such as development, testing, and production.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>aws</category>
      <category>networking</category>
    </item>
    <item>
      <title>Kiro: Instant Finance &amp; Expense Tracking</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Sun, 04 Jan 2026 18:04:44 +0000</pubDate>
      <link>https://forem.com/shreya111111/kiro-instant-finance-expense-tracking-1ldf</link>
      <guid>https://forem.com/shreya111111/kiro-instant-finance-expense-tracking-1ldf</guid>
      <description>&lt;p&gt;A lightweight finance and budget calculator built using &lt;strong&gt;Kiro&lt;/strong&gt;, designed to help users quickly calculate expenses, track budgets, and understand their financial status &lt;strong&gt;in a fraction of a second&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This project is intentionally kept &lt;strong&gt;simple&lt;/strong&gt; and &lt;strong&gt;beginner-friendly&lt;/strong&gt;, making it ideal for learning Kiro, building demos, or showcasing how Kiro’s chat-based intelligence can power practical applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Overview
&lt;/h2&gt;

&lt;p&gt;Managing finances does not always require complex accounting software. Many users simply need a fast way to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enter a budget&lt;/li&gt;
&lt;li&gt;Add expenses&lt;/li&gt;
&lt;li&gt;See how much they have spent&lt;/li&gt;
&lt;li&gt;Know how much money is left&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kiro – Simple Finance &amp;amp; Budget Calculator&lt;/strong&gt; solves exactly this problem using a clean UI and Kiro’s AI-driven chat assistance.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Budget Input&lt;/strong&gt; – Enter a total budget or income&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expense Tracking&lt;/strong&gt; – Add multiple expenses with name and amount&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Instant Calculations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total expenses&lt;/li&gt;
&lt;li&gt;Remaining balance&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Overspending Detection&lt;/strong&gt; – Alerts when expenses exceed the budget&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kiro Chat Interface&lt;/strong&gt; – Ask finance questions in natural language&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Minimal &amp;amp; Clean UI&lt;/strong&gt; – Easy to understand for all users&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kiro&lt;/strong&gt; – AI assistant and chat logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript / HTML / React&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;python&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This project focuses on logic simplicity rather than heavy backend architecture.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⚙️ Installation &amp;amp; Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js (v16 or above recommended)&lt;/li&gt;
&lt;li&gt;npm or yarn&lt;/li&gt;
&lt;li&gt;Kiro account&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2️⃣ Install Kiro
&lt;/h3&gt;

&lt;p&gt;Follow the official Kiro getting started guide:&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://kiro.dev/docs/" rel="noopener noreferrer"&gt;kiro docs&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3️⃣ Clone the Repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Shreya111111/tracker-kiro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ▶️ How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;User enters a &lt;strong&gt;budget amount&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;User adds &lt;strong&gt;individual expenses&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Processes the data instantly&lt;/li&gt;
&lt;li&gt;App calculates:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Total expenses&lt;/li&gt;
&lt;li&gt;Remaining balance

&lt;ol&gt;
&lt;li&gt;Results are displayed clearly on the screen&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  How Kiro Helps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Understands user intent&lt;/li&gt;
&lt;li&gt;Performs calculations accurately&lt;/li&gt;
&lt;li&gt;Responds with simple, human-readable answers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💬 Using Kiro Chat &amp;amp; Spec for Design &amp;amp; Implementation Phases
&lt;/h2&gt;

&lt;p&gt;Kiro Chat was used throughout this project as a &lt;strong&gt;design-thinking and implementation assistant&lt;/strong&gt;, helping move step by step from idea to a working finance and budget calculator.&lt;/p&gt;

&lt;p&gt;Instead of directly writing all logic or UI upfront, the development followed &lt;strong&gt;phased guidance using Kiro Chat&lt;/strong&gt;, as recommended in Kiro’s official workflow approach.&lt;br&gt;
&lt;strong&gt;Core Components of a Kiro Spec&lt;/strong&gt;&lt;br&gt;
Kiro typically generates three primary markdown files for every new feature or project to ensure alignment between requirements and code: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;requirements.md&lt;/strong&gt;: Captures user stories and acceptance criteria, often using EARS (Easy Approach to Requirements Syntax) notation to make intent explicit and testable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;design.md&lt;/strong&gt;: Documents the technical architecture, including sequence diagrams (often via Mermaid) and data flow models.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;tasks.md&lt;/strong&gt;: Provides a detailed, trackable implementation plan. Kiro breaks the design into discrete tasks that agents can execute one by one&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Phase 1: Problem Understanding &amp;amp; Scope Definition
&lt;/h2&gt;

&lt;p&gt;The first step was to clearly define &lt;em&gt;what the app should and should not do&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kiro Chat Usage
&lt;/h3&gt;

&lt;p&gt;Example prompts used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Help me define a finance and budget calculator for beginners&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;What features should a basic budget calculator include?&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;What should I avoid to keep the app simple?&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Outcome
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Clear scope defined&lt;/li&gt;
&lt;li&gt;No complex finance rules&lt;/li&gt;
&lt;li&gt;Focus on budget, expenses, and balance only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This aligns with Kiro’s guidance to &lt;strong&gt;start with clarity before implementation&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎨 Phase 2: UI / UX Design Assistance
&lt;/h2&gt;

&lt;p&gt;Kiro Chat was then used to assist with &lt;strong&gt;basic UI planning&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kiro Chat Usage
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Suggest a UI layout for a budget calculator&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;What input fields are required for this app?&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;How should results be displayed clearly?&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Outcome
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Budget input field&lt;/li&gt;
&lt;li&gt;Expense name + amount inputs&lt;/li&gt;
&lt;li&gt;Summary section for totals&lt;/li&gt;
&lt;li&gt;Minimal, clean layout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kiro helped translate functional requirements into &lt;strong&gt;simple UI components&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Phase 3: Logic &amp;amp; Calculation Design
&lt;/h2&gt;

&lt;p&gt;Before coding, Kiro Chat was used to validate the calculation logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kiro Chat Usage
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;How to calculate total expenses and remaining budget?&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;What happens if expenses exceed the budget?&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Explain the logic in simple steps&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Outcome
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Clear calculation flow&lt;/li&gt;
&lt;li&gt;Overspending condition defined&lt;/li&gt;
&lt;li&gt;Easy-to-implement logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This phase reduced errors before implementation.&lt;/p&gt;




&lt;h2&gt;
  
  
  💻 Phase 4: Implementation Support
&lt;/h2&gt;

&lt;p&gt;During development, Kiro Chat acted as a &lt;strong&gt;real-time coding assistant&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kiro Chat Usage
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Help me write simple logic for adding expenses&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;How to update total dynamically when a new expense is added?&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Explain this code in simple terms&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Outcome
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Faster implementation&lt;/li&gt;
&lt;li&gt;Cleaner logic&lt;/li&gt;
&lt;li&gt;Better understanding of each step&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Phase 5: Chat-Based User Interaction
&lt;/h2&gt;

&lt;p&gt;Kiro Chat was also integrated as a &lt;strong&gt;user-facing feature&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example User Queries
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;What is my total expense?&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;How much budget is left?&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Am I overspending?&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Summarize my expenses&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kiro interprets these queries and responds with calculated results in plain language.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 Phase 6: Review &amp;amp; Refinement
&lt;/h2&gt;

&lt;p&gt;Finally, Kiro Chat was used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review app flow&lt;/li&gt;
&lt;li&gt;Identify missing edge cases&lt;/li&gt;
&lt;li&gt;Suggest small UX improvements&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Review my budget calculator flow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;What improvements can make this more user-friendly?&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Alignment with Kiro Best Practices
&lt;/h2&gt;

&lt;p&gt;As referenced from the &lt;strong&gt;Kiro official documentation and guides&lt;/strong&gt;, this phased approach follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear problem definition&lt;/li&gt;
&lt;li&gt;Iterative design&lt;/li&gt;
&lt;li&gt;Incremental implementation&lt;/li&gt;
&lt;li&gt;Continuous validation using chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kiro Chat proved effective not just for coding, but for &lt;strong&gt;thinking, designing, and refining&lt;/strong&gt; the application end to end.&lt;/p&gt;




&lt;h2&gt;
  
  
  📸 Screenshots
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Attached screenshots&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Budget input screen&lt;/li&gt;
&lt;li&gt;Expense entry screen&lt;/li&gt;
&lt;li&gt;Expense summary&lt;/li&gt;
&lt;li&gt;Kiro chat interaction&lt;/li&gt;
&lt;/ul&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%2Fhakgdnnpl7hao12n4wkx.jpg" 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%2Fhakgdnnpl7hao12n4wkx.jpg" alt="Image1" width="800" height="1066"&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%2F3g3g0n8tno05r6qgsofq.jpg" 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%2F3g3g0n8tno05r6qgsofq.jpg" alt="Image2" width="800" height="600"&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%2Fg2bqr0xulo6ull3h5h3j.jpg" 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%2Fg2bqr0xulo6ull3h5h3j.jpg" alt="Ima" width="800" height="600"&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%2Fj06kex9y8n93dy8rb17g.jpg" 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%2Fj06kex9y8n93dy8rb17g.jpg" alt="I" width="800" height="600"&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%2Fviyqbeywhaq6thjfb36m.jpg" alt="Imag" width="800" height="600"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  📂 Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kiro-finance-budget-calculator/
├── kiro.
├── vscode/
├── index.html
├── script.js
├── styles.css
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔗 GitHub Repository
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/Shreya111111/tracker-kiro" rel="noopener noreferrer"&gt;Repo Link&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Personal monthly budgeting&lt;/li&gt;
&lt;li&gt;Student expense tracking&lt;/li&gt;
&lt;li&gt;Kiro learning project&lt;/li&gt;
&lt;li&gt;Demo or hackathon submission&lt;/li&gt;
&lt;li&gt;Proof of concept for AI-powered calculators&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Added features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Expense categories (Food, Rent, Travel, etc.)&lt;/li&gt;
&lt;li&gt;Monthly history tracking&lt;/li&gt;
&lt;li&gt;Visual charts&lt;/li&gt;
&lt;li&gt;Mobile-friendly UI&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤝 Contributing
&lt;/h2&gt;

&lt;p&gt;Contributions are welcome!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fork the repository&lt;/li&gt;
&lt;li&gt;Create a feature branch&lt;/li&gt;
&lt;li&gt;Commit your changes&lt;/li&gt;
&lt;li&gt;Open a pull request&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;If you found this project useful, please ⭐ the repository and share your feedback!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>serverless</category>
      <category>kiro</category>
    </item>
    <item>
      <title>KendoManage - Personal Task Scheduler &amp; Manager( 30+ Kendo components + Built using KendoReact AI Code assistant)</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Sun, 28 Sep 2025 18:16:30 +0000</pubDate>
      <link>https://forem.com/shreya111111/kendomanage-personal-task-scheduler-manager-20-kendo-components-built-using-kendo-ai-code-2bo8</link>
      <guid>https://forem.com/shreya111111/kendomanage-personal-task-scheduler-manager-20-kendo-components-built-using-kendo-ai-code-2bo8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kendoreact-2025-09-10"&gt;KendoReact Free Components Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

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

&lt;p&gt;I created &lt;strong&gt;KendoManager&lt;/strong&gt;, a 🌟 feature-rich, enterprise-grade &lt;strong&gt;project management &amp;amp; collaboration platform&lt;/strong&gt; with modern UI/UX patterns. Here's what it offers:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📋 &lt;strong&gt;Task Management&lt;/strong&gt;: Create, edit, delete tasks; track progress 📊; assign priorities 🔝; attach files 📎; manage due dates 🗓️; support parent-child tasks 🌱.
&lt;/li&gt;
&lt;li&gt;👥 &lt;strong&gt;Team Collaboration&lt;/strong&gt;: Real-time member status 🟢🟡🔴; task-based comments 💬; @mentions with notifications 🔔; team profiles 🧑‍💼.
&lt;/li&gt;
&lt;li&gt;📅 &lt;strong&gt;Calendar &amp;amp; Scheduling&lt;/strong&gt;: Event scheduling 🕒; multiple calendar views 🗓️; date marking 🎯; visual analytics 📈.
&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Analytics &amp;amp; Reporting&lt;/strong&gt;: Task distribution charts 📊; monthly trends 📅; KPI tracking 🎯; interactive dashboards 🖥️.
&lt;/li&gt;
&lt;li&gt;📂 &lt;strong&gt;File Management&lt;/strong&gt;: Upload/download files ⬆️⬇️; categorize and search files 🔍; share files with team members 🤝.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this is built using &lt;strong&gt;30+ KendoReact components&lt;/strong&gt; 🎨, ensuring a polished, interactive, and scalable experience 💻✨.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚡ Parts of the UI scaffolding were generated and refined using the &lt;strong&gt;Kendo AI Coding Assistant&lt;/strong&gt; 🤖, speeding up development and improving code quality.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/p6r-vI2N5Is"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&gt; : &lt;a href="https://github.com/Shreya111111/Kendomanager_new" rel="noopener noreferrer"&gt;https://github.com/Shreya111111/Kendomanager_new&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Demo Live Link&lt;/strong&gt; : &lt;a href="https://kendomanager-new.vercel.app/" rel="noopener noreferrer"&gt;https://kendomanager-new.vercel.app/&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%2Ftjb7vfqwtnrrxifi7lc2.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%2Ftjb7vfqwtnrrxifi7lc2.png" alt="Image21 description"&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%2F05jzzhoni9gk3ufmfmw8.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%2F05jzzhoni9gk3ufmfmw8.png" alt="Image 222description"&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%2Ft2z11m07piqum90amxkt.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%2Ft2z11m07piqum90amxkt.png" alt="Image 22description"&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%2Fodiirrpugv93jqo2o6ag.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%2Fodiirrpugv93jqo2o6ag.png" alt="Imag22 description"&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%2Fyp5wd4w0zv20ykb4ceah.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%2Fyp5wd4w0zv20ykb4ceah.png" alt="Image22description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  KendoReact Components Used
&lt;/h2&gt;

&lt;h1&gt;
  
  
  📦 KendoReact Components &amp;amp; Installation Commands(30+ KendoUI free components used)
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Category&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Components&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Installation Command&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Grid&lt;/code&gt;, &lt;code&gt;GridColumn&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @progress/kendo-react-grid @progress/kendo-data-query @progress/kendo-react-intl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Charts &amp;amp; Visualization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Chart&lt;/code&gt;, &lt;code&gt;ChartSeries&lt;/code&gt;, &lt;code&gt;ChartSeriesItem&lt;/code&gt;, &lt;code&gt;ChartCategoryAxis&lt;/code&gt;, &lt;code&gt;ChartCategoryAxisItem&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @progress/kendo-react-charts hammerjs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Form Controls&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Button&lt;/code&gt;, &lt;code&gt;Input&lt;/code&gt;, &lt;code&gt;TextArea&lt;/code&gt;, &lt;code&gt;Switch&lt;/code&gt;, &lt;code&gt;Slider&lt;/code&gt;, &lt;code&gt;Form&lt;/code&gt;, &lt;code&gt;Field&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @progress/kendo-react-buttons @progress/kendo-react-inputs @progress/kendo-react-form&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dropdowns &amp;amp; Selection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;DropDownList&lt;/code&gt;, &lt;code&gt;MultiSelect&lt;/code&gt;, &lt;code&gt;ComboBox&lt;/code&gt;, &lt;code&gt;AutoComplete&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @progress/kendo-react-dropdowns&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Date &amp;amp; Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Calendar&lt;/code&gt;, &lt;code&gt;DatePicker&lt;/code&gt;, &lt;code&gt;DateRangePicker&lt;/code&gt;, &lt;code&gt;Scheduler&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @progress/kendo-react-dateinputs @progress/kendo-react-scheduler&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Layout &amp;amp; UI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Card&lt;/code&gt;, &lt;code&gt;CardBody&lt;/code&gt;, &lt;code&gt;CardTitle&lt;/code&gt;, &lt;code&gt;Avatar&lt;/code&gt;, &lt;code&gt;Badge&lt;/code&gt;, &lt;code&gt;Dialog&lt;/code&gt;, &lt;code&gt;TabStrip&lt;/code&gt;, &lt;code&gt;TabStripTab&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @progress/kendo-react-layout @progress/kendo-react-dialogs @progress/kendo-react-indicators&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Indicators&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ProgressBar&lt;/code&gt;, &lt;code&gt;Badge&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @progress/kendo-react-progressbars @progress/kendo-react-indicators&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File Handling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Upload&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @progress/kendo-react-upload&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🔑 Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;All KendoReact packages require installing &lt;strong&gt;KendoReact Base &amp;amp; Styling&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @progress/kendo-react-intl @progress/kendo-theme-default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Prize Code Smarter, Not Harder prize category- AI Coding Assistant Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔧 Installation
&lt;/h3&gt;

&lt;p&gt;To integrate the KendoReact AI Coding Assistant into my development environment, I followed these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set Up a React Application&lt;/strong&gt;: I created a new React project using Vite:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm create vite@latest kendo-manager
   &lt;span class="nb"&gt;cd &lt;/span&gt;kendo-manager
   npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Install KendoReact Components: I installed the necessary KendoReact components for UI elements:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;&lt;br&gt;
npm install @progress/kendo-react-grid @progress/kendo-react-charts @progress/kendo-react-inputs @progress/kendo-react-buttons @progress/kendo-react-dropdowns @progress/kendo-react-dateinputs @progress/kendo-react-scheduler @progress/kendo-react-layout @progress/kendo-react-dialogs @progress/kendo-react-progressbars @progress/kendo-react-upload @progress/kendo-react-intl @progress/kendo-theme-default&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install the AI Coding Assistant: I added the KendoReact AI Coding Assistant to enhance development efficiency:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install @progress/kendo-react-mcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure the AI Coding Assistant&lt;/strong&gt;: I integrated the assistant into my development environment, enabling it to provide context-aware code suggestions and enhancements.&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Usage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The KendoReact AI Coding Assistant significantly improved my development workflow in the following ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initial Code Generation&lt;/strong&gt;: It helped me quickly scaffold components like Grids, Forms, and Charts, allowing for rapid prototyping and development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component Configuration&lt;/strong&gt;: The assistant provided guidance on configuring complex components, such as setting up multi-column headers in Grids or configuring recurring events in the Scheduler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Binding Assistance&lt;/strong&gt;: It assisted in binding dummy data to components for testing and prototyping purposes, streamlining the development process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step-by-Step Explanations&lt;/strong&gt;: The assistant offered detailed explanations of the code snippets it generated, helping me understand the implementation and learn best practices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Troubleshooting&lt;/strong&gt;: It provided preliminary solutions to common issues, saving time on debugging and problem-solving.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Screenshots of KendoReact AI coding Assistant
&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%2Fngghnpvjrg8s7k62ij0a.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%2Fngghnpvjrg8s7k62ij0a.png" alt="Image descrip99tion"&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%2Fpwv4k8nf2yrworsjadh2.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%2Fpwv4k8nf2yrworsjadh2.png" alt="Image 44description"&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%2Fecddfzkv9w1v92h5h1z7.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%2Fecddfzkv9w1v92h5h1z7.png" alt="Image d44escription"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Liked in the KendoReact AI Coding Assistant
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;Accelerated Component Development&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;The AI assistant rapidly generates code for various KendoReact components, enabling faster prototyping and reducing time spent on boilerplate code.&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Expert Configuration Guidance&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;It provides detailed assistance with complex component configurations, such as setting up multi-column headers in Grids and managing advanced Scheduler features.&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;Simplified Data Binding&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;The assistant streamlines the process of binding data to components, making it easier to set up testing environments and prototypes quickly.&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Clear Code Explanations&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;It offers step-by-step breakdowns of generated code, helping developers understand implementation details and best practices more effectively.&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Efficient Troubleshooting&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;By providing preliminary solutions to common issues, the assistant reduces debugging time and helps resolve problems faster.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>kendoreactchallenge</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Iris- Your AI Interviewer(Audio+ Visual+ Live Cam+ Feedback)🎙️📹✨</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Sun, 14 Sep 2025 16:40:10 +0000</pubDate>
      <link>https://forem.com/shreya111111/iris-your-ai-intervieweraudio-visual-live-cam-feedback-4nl2</link>
      <guid>https://forem.com/shreya111111/iris-your-ai-intervieweraudio-visual-live-cam-feedback-4nl2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-ai-studio-2025-09-03"&gt;Google AI Studio Multimodal Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Iris is an &lt;strong&gt;AI-powered Interview Coach&lt;/strong&gt; designed to help candidates practice, improve, and excel in interviews.&lt;br&gt;
Instead of reading generic interview guides, Iris creates a personalized interview experience by combining resume understanding, live camera interaction, and structured feedback — powered by &lt;strong&gt;Google AI Studio&lt;/strong&gt; (Gemini multimodal models).&lt;/p&gt;

&lt;p&gt;It feels just like a face-to-face mock interview with a professional hiring manager, but available anytime, anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 Iris Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📄 &lt;strong&gt;Resume Scan&lt;/strong&gt; – Upload PDF/image, extracts key skills, experience, education &amp;amp; generates a concise summary.&lt;/li&gt;
&lt;li&gt;🎤 &lt;strong&gt;Live AI Interview&lt;/strong&gt; – Face-to-face AI interviewer with camera &amp;amp; mic, adapting questions to your resume &amp;amp; responses.&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Personalized Feedback &amp;amp; Coaching&lt;/strong&gt; – Gets strengths, areas to improve, and STAR method evaluation from your session.&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Download Feedback Report&lt;/strong&gt; – Save detailed feedback as a document.&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;Share Progress&lt;/strong&gt; – Share reports with friends/mentors for collaborative review.&lt;/li&gt;
&lt;li&gt;📜 &lt;strong&gt;Interview History&lt;/strong&gt; – Timeline of past interviews with scores &amp;amp; feedback summaries.&lt;/li&gt;
&lt;li&gt;📂 &lt;strong&gt;Previous Transcripts&lt;/strong&gt; – View transcripts with questions &amp;amp; answers to track progress over multiple sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎥 Demo
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;Video&lt;/strong&gt;&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/11716f2220be464890fbb64b12ddae6a"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Note : &lt;em&gt;You might be not able to hear AI Voice in the video because my system is not able to catch system audio when doing screen recording because of some issue. I am attaching the deployed link below so that you can try it out yourself. All you have to do is upload the resume(PDF) format. Avoid using app repeatedly at a particular time frame as it might exhaust the API credits&lt;/em&gt;.&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Deployed Cloud Run Link&lt;/strong&gt; : &lt;a href="https://iris-your-ai-interviewer-47821800150.us-west1.run.app/" rel="noopener noreferrer"&gt;https://iris-your-ai-interviewer-47821800150.us-west1.run.app/&lt;/a&gt;

&lt;h2&gt;
  
  
  Screenshots
&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%2F3tiqvw2tjhu677agdd1j.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%2F3tiqvw2tjhu677agdd1j.png" alt="Image1description"&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%2Fyerdoqa3wa81sldtlnz5.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%2Fyerdoqa3wa81sldtlnz5.png" alt="Image2description"&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%2Fixi9335h653qsvwk092e.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%2Fixi9335h653qsvwk092e.png" alt="Image23description"&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%2Fiwteh4r78emrcn1co5ic.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%2Fiwteh4r78emrcn1co5ic.png" alt="Image34description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;App Source Code : &lt;a href="https://drive.google.com/file/d/1ZrP9ZgLQytSJsgS9Bl9IT6yC-G0_xT7R/view?usp=sharing" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧑‍💻 Features in Detail&lt;br&gt;
&lt;strong&gt;1. 📄 Resume Scan + AI Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Upload your resume as a PDF or image.&lt;/p&gt;

&lt;p&gt;Iris uses Gemini multimodal capabilities to extract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Key skills&lt;/li&gt;
&lt;li&gt;✅ Experience highlights&lt;/li&gt;
&lt;li&gt;✅ Education &amp;amp; certifications&lt;/li&gt;
&lt;li&gt;Generates a concise summary to guide the interview.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. 🎤 Live AI Interview (Audio + Visual + Camera)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Iris acts as a &lt;strong&gt;virtual interviewer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You interact face-to-face using your camera and microphone.&lt;/li&gt;
&lt;li&gt;The AI adapts its questions to your resume and responses.&lt;/li&gt;
&lt;li&gt;Covers both behavioral (STAR method) and technical questions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. 🤖 Personalized Feedback &amp;amp; Coaching&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After the session, Iris analyzes the entire transcript.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feedback includes:&lt;/li&gt;
&lt;li&gt;🌟 Strengths (clarity, confidence, relevance)&lt;/li&gt;
&lt;li&gt;📌 *&lt;em&gt;Areas to Improve *&lt;/em&gt;(with actionable advice)&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;STAR Method&lt;/strong&gt; Evaluation (Situation, Task, Action, Result)&lt;/li&gt;
&lt;li&gt;Output is structured, easy to understand, and encouraging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. 📑 Save &amp;amp; Share Your Progress&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;💾 &lt;strong&gt;Download Feedback&lt;/strong&gt; Report as a document.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Share with friends/mentors&lt;/strong&gt; for collaborative review.&lt;/p&gt;

&lt;h2&gt;
  
  
  📜 Include Interview History
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Show a &lt;strong&gt;timeline&lt;/strong&gt; of past interviews:&lt;/li&gt;
&lt;li&gt;Date &amp;amp; time of each interview&lt;/li&gt;
&lt;li&gt;Overall score or feedback summary&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📂 Include Previous Interview Transcripts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Provide &lt;strong&gt;transcripts&lt;/strong&gt; or summaries of past interviews&lt;/li&gt;
&lt;li&gt;Questions asked&lt;/li&gt;
&lt;li&gt;Candidate answers
Helps &lt;strong&gt;track progress&lt;/strong&gt; across multiple practice sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ How I Used Google AI Studio
&lt;/h2&gt;

&lt;p&gt;Iris is powered by &lt;strong&gt;Gemini multimodal&lt;/strong&gt;features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resume Parsing (File + Text Input)&lt;/li&gt;
&lt;li&gt;Uses gemini-2.5-flash to extract structured insights from resumes.&lt;/li&gt;
&lt;li&gt;Interview Simulation (Chat API)&lt;/li&gt;
&lt;li&gt;Creates a dynamic chat session where Gemini acts as a hiring manager.&lt;/li&gt;
&lt;li&gt;Feedback Analysis (JSON Schema)&lt;/li&gt;
&lt;li&gt;Ensures structured responses:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "strengths": ["Good clarity", "Relevant examples"],
  "areasForImprovement": ["Expand on technical depth", "Use STAR format"]
}

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

&lt;/div&gt;



&lt;p&gt;📦 Gemini Services Used&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. gemini-2.5-flash ⚡&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fastest multimodal Gemini model.&lt;/li&gt;
&lt;li&gt;Handles resume parsing from PDFs/images quickly.&lt;/li&gt;
&lt;li&gt;Great for interactive chat-based interviews where low latency is critical.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { GoogleGenAI, Chat, Type } from "@google/genai";


✅ generateContent() → Resume extraction + feedback generation

✅ chats.create() → Interactive interview simulation

✅ JSON schema → Well-structured coaching insights
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Why Iris?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎯 Problem: Many candidates struggle with interview preparation — either they don’t know what to expect or lack constructive feedback.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🌟 Solution: Iris provides a safe, intelligent, and supportive environment to practice, with AI that:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understands your resume&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conducts live interviews&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gives actionable coaching feedback&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Helps you improve over time&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;With Iris, you no longer have to walk into an interview unprepared.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Atomica- Turn Science into understandable concepts (Audio+Visual+ Tutoring)</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Sun, 07 Sep 2025 08:33:49 +0000</pubDate>
      <link>https://forem.com/shreya111111/atomica-turn-science-into-understandable-concepts-1onj</link>
      <guid>https://forem.com/shreya111111/atomica-turn-science-into-understandable-concepts-1onj</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-ai-studio-2025-09-03"&gt;Google AI Studio Multimodal Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Atomica&lt;/strong&gt; is an AI-powered educational app that transforms science learning into an interactive, visual, auditory, and engaging experience. It helps students understand complex concepts through diagrams, explanations, quizzes, flashcards, AI-powered tutoring, and audio narration. By combining &lt;strong&gt;multimodal AI capabilities&lt;/strong&gt;, Atomica addresses the common problem of abstract science topics being hard to visualize, understand, and memorize, creating a hands-on, multisensory learning experience for students of all ages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Atomica User Input
&lt;/h2&gt;

&lt;p&gt;👤 &lt;strong&gt;Your Level&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Who are you learning for?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧒 Kid&lt;/li&gt;
&lt;li&gt;🎓 High School Student&lt;/li&gt;
&lt;li&gt;🎓👩‍🎓 College Student&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔬 &lt;strong&gt;Scientific Concept&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Type the science topic you want to learn:&lt;/p&gt;

&lt;p&gt;Examples: Photosynthesis, Newton’s Laws, DNA replication&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Language&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Choose the language you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🇬🇧 English&lt;/li&gt;
&lt;li&gt;🇮🇳 Hindi&lt;/li&gt;
&lt;li&gt;🇫🇷 French&lt;/li&gt;
&lt;li&gt;🇩🇪 German&lt;/li&gt;
&lt;li&gt;🇪🇸 Spanish&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📚 &lt;strong&gt;Learning Mode&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do you want to learn?&lt;/li&gt;
&lt;li&gt;🖼️ Diagrams &amp;amp; visuals&lt;/li&gt;
&lt;li&gt;🎧 Audio explanations&lt;/li&gt;
&lt;li&gt;📝 Quizzes &amp;amp; flashcards&lt;/li&gt;
&lt;li&gt;🤖 AI tutor guidance&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Demo Link&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/6a7491f4d9ea4550aa33893ccd75e39c"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Deployed Cloud Run App&lt;/strong&gt;: &lt;a href="https://atomica-47821800150.us-west1.run.app/" rel="noopener noreferrer"&gt;Atomica Live Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshots&lt;/strong&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%2Fex7t19wv9j3lbbsgllxf.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%2Fex7t19wv9j3lbbsgllxf.png" alt="Image1"&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%2Fit0nzt7ex6ijl4p8r8n0.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%2Fit0nzt7ex6ijl4p8r8n0.png" alt="Image4description"&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%2F5mohvidzk6mge4zc1c9v.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%2F5mohvidzk6mge4zc1c9v.png" alt="Image2description"&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%2Fsnnpx4k0vq8jreaq7ixl.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%2Fsnnpx4k0vq8jreaq7ixl.png" alt="Image3description"&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%2F0bgbdbipxve663d85p4s.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%2F0bgbdbipxve663d85p4s.png" alt="Image5description"&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%2F1g4q12v17ibgi0w9lnwh.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%2F1g4q12v17ibgi0w9lnwh.png" alt="Image6description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Google AI Studio
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Diagram Generation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does&lt;/strong&gt;: Converts a text prompt (like “Photosynthesis” or “Black Hole”) into a visual diagram.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How it works&lt;/strong&gt;: Uses AI to generate a clean, modern, educational illustration, highlighting only the key components with minimal text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it’s valuable&lt;/strong&gt;: Makes abstract scientific concepts visible and easier to understand, helping visual learners quickly grasp ideas that are otherwise hard to imagine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Multimodal Explanations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does&lt;/strong&gt;: Provides explanations based on the generated diagrams, combining both visual and textual information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How it works&lt;/strong&gt;: AI analyzes the diagram and the topic prompt, then generates a concise, context-aware explanation. It can also use analogies for easier understanding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it’s valuable&lt;/strong&gt;: Supports deep comprehension, allowing learners to connect the visual information to the underlying science in a meaningful way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Audio Narration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does&lt;/strong&gt;: Reads explanations aloud to students.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How it works&lt;/strong&gt;: Uses AI to generate natural-sounding speech from the text explanations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it’s valuable&lt;/strong&gt;: Supports auditory learners and makes the platform accessible to students with visual impairments. It also allows multitasking or studying on the go.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Interactive Q&amp;amp;A (AI Chat Tutor)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does&lt;/strong&gt;: Allows students to ask follow-up questions about any topic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How it works&lt;/strong&gt;: AI uses the context of the explanation and diagram to provide relevant, accurate answers in real time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it’s valuable&lt;/strong&gt;: Creates a personalized learning experience, helping students clarify doubts instantly instead of waiting for a teacher or searching elsewhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Quiz and Flashcard Generation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does&lt;/strong&gt;: Automatically creates multiple-choice quizzes and flashcards from the explanation text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How it works&lt;/strong&gt;: AI extracts key concepts and formulates questions, answers, and concise definitions for flashcards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it’s valuable&lt;/strong&gt;: Encourages active recall and spaced repetition, which are proven techniques for memory retention and mastery of concepts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Translation Support&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does&lt;/strong&gt;: Converts explanations, quizzes, and flashcards into multiple languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How it works&lt;/strong&gt;: AI translates text while maintaining clarity and scientific accuracy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it’s valuable&lt;/strong&gt;: Makes learning accessible to non-English speakers and supports global users, expanding the app’s usability and reach.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Together, these features make Atomica a complete multisensory learning platform. Students can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;See diagrams&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read and hear explanations&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test themselves with quizzes and flashcards&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interact with an AI tutor&lt;/strong&gt;, and&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn in multiple languages, all in one place&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Multimodal Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image Generation&lt;/strong&gt;: The &lt;code&gt;imagen-4.0-generate-001&lt;/code&gt; model is used to generate clear, educational diagrams from text prompts. Note that this model may require a paid tier, and free-tier access may not be available.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal Explanation&lt;/strong&gt;: The &lt;code&gt;gemini-2.5-flash&lt;/code&gt; model analyzes both diagrams and text prompts to provide context-aware explanations, making complex science concepts easy to understand. This is fully supported in the free tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quiz Generation&lt;/strong&gt;: Also using &lt;code&gt;gemini-2.5-flash&lt;/code&gt;, Atomica automatically generates multiple-choice quizzes based on the explanations, helping students test their understanding. Free-tier usage is supported.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flashcards&lt;/strong&gt;: The same &lt;code&gt;gemini-2.5-flash&lt;/code&gt; model creates memorization flashcards for key concepts, aiding active recall and long-term retention. Free-tier access is available.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat Tutor&lt;/strong&gt;: &lt;code&gt;gemini-2.5-flash&lt;/code&gt; powers the interactive Q&amp;amp;A feature, allowing students to ask follow-up questions and receive accurate, context-aware answers. This feature is supported on the free tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translation&lt;/strong&gt;: Using &lt;code&gt;gemini-2.5-flash&lt;/code&gt;, Atomica can translate explanations, quizzes, and flashcards into multiple languages, expanding accessibility for global learners. Free-tier usage is supported.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>🎯 9-to-Alive: The Intranet Homepage Reinvented with Axero’s Vision</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Sun, 20 Jul 2025 16:06:05 +0000</pubDate>
      <link>https://forem.com/shreya111111/9-to-alive-the-intranet-homepage-reinvented-with-axeros-vision-43mj</link>
      <guid>https://forem.com/shreya111111/9-to-alive-the-intranet-homepage-reinvented-with-axeros-vision-43mj</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;br&gt;
&lt;strong&gt;&lt;em&gt;"Where employees go to get things done."&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inspired by Axero's core principles—Productivity, Collaboration, Beautiful UI, People-Centric Design, and Instant Access to Information—this intranet homepage brings together purpose, aesthetics, and smart interactivity.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;



&lt;p&gt;🌟 Main Features Overview&lt;br&gt;
🎯&lt;strong&gt;1. Smart Navigation &amp;amp; UX&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sticky Tab Navigation that follows the user as they scroll.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keyboard Shortcuts for instant access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⌘+H – HR Portal&lt;/li&gt;
&lt;li&gt;⌘+I – IT Help Desk&lt;/li&gt;
&lt;li&gt;⌘+T – Timesheets&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⌘+S – Team Chat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Notification Badges for unread announcements or messages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Animated Active Tab Indicators and toast notifications.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🗂️ Interactive Core Tabs&lt;br&gt;
📅 &lt;strong&gt;2. Events Tab&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Plan, RSVP, and participate with ease."&lt;/li&gt;
&lt;li&gt;RSVP-enabled interactive event cards with hover details.&lt;/li&gt;
&lt;li&gt;Advanced filtering by type: Meetings, Lunches, Hackathons, Holidays.&lt;/li&gt;
&lt;li&gt;Real-time search with suggestions.&lt;/li&gt;
&lt;li&gt;Event creation modal + notification system.&lt;/li&gt;
&lt;/ul&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%2Fp6mgfn0x3873hxlqcx9n.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%2Fp6mgfn0x3873hxlqcx9n.png" alt="Image1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👥 &lt;strong&gt;3. Teams Tab&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Know your people. Celebrate them."&lt;/li&gt;
&lt;li&gt;Expandable team member profiles with click-to-reveal contact info.&lt;/li&gt;
&lt;li&gt;Department filters and search.&lt;/li&gt;
&lt;li&gt;Work anniversary trackers and online/offline status indicators.&lt;/li&gt;
&lt;li&gt;“Connect” and “Message” buttons with animations.&lt;/li&gt;
&lt;/ul&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%2F76b7n0vd5g6pjjgj17kx.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%2F76b7n0vd5g6pjjgj17kx.png" alt="Image2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📁 &lt;strong&gt;4. Resources Tab&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Everything you need. Instantly."&lt;/li&gt;
&lt;li&gt;Downloadable documents with rating system.&lt;/li&gt;
&lt;li&gt;Bookmark functionality using localStorage.&lt;/li&gt;
&lt;li&gt;Sorting by name, downloads, rating, date.&lt;/li&gt;
&lt;li&gt;Category and tag filters.&lt;/li&gt;
&lt;/ul&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%2Fgslrap3w2oyftu1ewgq7.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%2Fgslrap3w2oyftu1ewgq7.png" alt="Image3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📢 &lt;strong&gt;5. Announcements Tab&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Stay informed, stay ahead."&lt;/li&gt;
&lt;li&gt;Priority levels: Urgent, High, Medium, Low.&lt;/li&gt;
&lt;li&gt;Visual indicators for read/unread.&lt;/li&gt;
&lt;li&gt;Like/comment system.&lt;/li&gt;
&lt;li&gt;Search + category filter.&lt;/li&gt;
&lt;li&gt;“Mark as Read” notifications.&lt;/li&gt;
&lt;/ul&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%2Fcz3liztn1puhf3inzut2.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%2Fcz3liztn1puhf3inzut2.png" alt="Image4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;6. Highlights Tab&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Capture moments that matter."&lt;/li&gt;
&lt;li&gt;Achievements, milestones, and news in visual cards.&lt;/li&gt;
&lt;li&gt;Masonry layout for a beautiful gallery effect.&lt;/li&gt;
&lt;li&gt;Persistent like/bookmark features.&lt;/li&gt;
&lt;li&gt;Sharing and reactions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🎮&lt;strong&gt;7. Interactive Games Tab: Gamified Learning Center&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;🧠 Company Trivia Game&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timed Q&amp;amp;A with:&lt;/li&gt;
&lt;li&gt;Score tracking&lt;/li&gt;
&lt;li&gt;Global leaderboard&lt;/li&gt;
&lt;li&gt;Confetti for high scores&lt;/li&gt;
&lt;li&gt;Progress indicators and question explanations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧩 Memory Challenge&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classic card matching gameplay.&lt;/li&gt;
&lt;li&gt;Score, move counter, reset.&lt;/li&gt;
&lt;li&gt;LocalStorage for personal score tracking.&lt;/li&gt;
&lt;li&gt;Confetti celebration on completion.&lt;/li&gt;
&lt;li&gt;Bonus: Global leaderboard for friendly competition!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔋 &lt;strong&gt;Enhanced Interactivity &amp;amp; Persistence&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time Feedback: Toasts, micro-interactions, hover states.&lt;/li&gt;
&lt;li&gt;Confetti Animations: For achievements and game completions.&lt;/li&gt;
&lt;li&gt;LocalStorage Integration:&lt;/li&gt;
&lt;li&gt;Bookmarks, likes&lt;/li&gt;
&lt;li&gt;Announcements read status&lt;/li&gt;
&lt;li&gt;Game scores&lt;/li&gt;
&lt;li&gt;Mood check-in data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💼&lt;strong&gt;Axero Signature Widgets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🏆 &lt;strong&gt;8. Team Spotlight (Axero Core Feature)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Celebrate excellence and foster culture."&lt;/li&gt;
&lt;li&gt;Employee of the Month (e.g. Sarah Chen – Senior Developer, Engineering)&lt;/li&gt;
&lt;li&gt;Click to appreciate (heart or kudos system)&lt;/li&gt;
&lt;li&gt;Highlights major contributions (e.g. “Outstanding performance in Q4 2024”)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📈 &lt;strong&gt;9. Project Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Track progress. Deliver with confidence."&lt;/li&gt;
&lt;li&gt;Projects with:&lt;/li&gt;
&lt;li&gt;Status indicators (active, overdue)&lt;/li&gt;
&lt;li&gt;Due dates and percentage completion&lt;/li&gt;
&lt;li&gt;Assigned team member avatars&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Customer Portal v2.0 – 75%&lt;/li&gt;
&lt;li&gt;Mobile App Redesign – 45%&lt;/li&gt;
&lt;li&gt;API Security Audit – 90%, Overdue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💬 &lt;strong&gt;10. Daily Check-in &amp;amp; Leadership Corner&lt;/strong&gt;&lt;br&gt;
"Prioritize mental wellbeing. Hear from leadership."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily Mood Check-in: Emoji-based (Happy, Okay, Stressed)&lt;/li&gt;
&lt;li&gt;Personalized response messages - Stored in localStorage for trend tracking&lt;/li&gt;
&lt;li&gt;Tip card: "Regular check-ins help us improve your work experience."&lt;/li&gt;
&lt;li&gt;Leadership Corner:&lt;/li&gt;
&lt;li&gt;Weekly message from CEO/Managers&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;“Excited to announce our Q4 results exceeded expectations! Thank you all for your incredible dedication.”&lt;br&gt;
– Jennifer Walsh, CEO&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Principle of the Day&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Be Customer-Obsessed: Every decision should benefit our customers first."&lt;/li&gt;
&lt;li&gt;Auto-rotating display of Axero’s core principles.&lt;/li&gt;
&lt;li&gt;Smooth transitions every 10 seconds using JS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💌 &lt;strong&gt;Kudos Wall&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Shoutouts that shape culture."&lt;/li&gt;
&lt;li&gt;Peer-to-peer appreciation board&lt;/li&gt;
&lt;li&gt;Like system (❤️)&lt;/li&gt;
&lt;li&gt;Timestamped kudos with sender &amp;amp; receiver cards&lt;/li&gt;
&lt;/ul&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%2Fjuq019vk97tqjgvm1lc9.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%2Fjuq019vk97tqjgvm1lc9.png" alt="Image7"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt; Live Demo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Explore the full interactive intranet experience here:  &lt;strong&gt;&lt;a href="https://famous-rugelach-28601d.netlify.app/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Shreya111111" rel="noopener noreferrer"&gt;
        Shreya111111
      &lt;/a&gt; / &lt;a href="https://github.com/Shreya111111/Intranet1" rel="noopener noreferrer"&gt;
        Intranet1
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🎯 9-to-Alive: The Intranet Homepage Reinvented with Axero’s Vision&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Welcome to &lt;strong&gt;Office Haven&lt;/strong&gt; — a modern, people-first digital workspace crafted to elevate team collaboration, boost morale, and make workdays more intuitive, engaging, and productive.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌐 &lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://famous-rugelach-28601d.netlify.app/" rel="nofollow noopener noreferrer"&gt;Check it out on Netlify!&lt;/a&gt;
&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💡 Features at a Glance&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🔧 Feature&lt;/th&gt;
&lt;th&gt;📝 Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📅 &lt;strong&gt;Live Events&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;RSVP-enabled event tiles with countdowns &amp;amp; speaker highlights.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 &lt;strong&gt;Knowledge Center&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Searchable documentation, team resources, and SOPs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎮 &lt;strong&gt;Gamification Hub&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Badge rewards, levels, and XP-based interactions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌈 &lt;strong&gt;Mood Check-ins&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Anonymous emoji-based status updates to support mental wellness.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌟 &lt;strong&gt;Team Spotlights&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Auto-rotating member highlights to boost morale and visibility.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📢 &lt;strong&gt;Announcement Carousel&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Company-wide updates in a rotating banner format.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔍 &lt;strong&gt;Quick Links Panel&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Instant access to HR tools, payroll, IT support, and more.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📈 &lt;strong&gt;Productivity Dashboard&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Track daily goals, completed tasks, and focus timers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🤝 &lt;strong&gt;Collaboration Feed&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Shout-outs, polls, and quick wins posted by the team.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Shreya111111/Intranet1" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;Designing Office Haven was an exciting opportunity to reimagine what a modern intranet could be. I focused on combining Axero’s core principles with engaging interactivity, ensuring a people-first experience that’s both functional and fun. From implementing 📅 live RSVP-enabled events to building a 🎮 gamified center and 😊 mood check-ins, each feature was crafted to promote productivity and culture. The result is a digital workspace that feels alive, intuitive, and truly collaborative.&lt;/p&gt;

&lt;p&gt;🛠️ My process began with deep research into Axero’s core values and product philosophy, which helped guide every 🧩 design and interaction choice. I 🧾 wireframed the layout to prioritize ease of navigation and 🔍 information accessibility, then built the interface using clean, modular code. ✨&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;License : MIT ❤️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Made in ❤️ by &lt;a href="https://dev.to/shreya111111"&gt;Shreya N&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>AI E-CommerceWatch – Product Research Agent for E-Commerce By RunnerH</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Thu, 19 Jun 2025 16:36:06 +0000</pubDate>
      <link>https://forem.com/shreya111111/ai-marketwatch-product-research-agent-for-e-commerce-by-runnerh-2lnd</link>
      <guid>https://forem.com/shreya111111/ai-marketwatch-product-research-agent-for-e-commerce-by-runnerh-2lnd</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/runnerh"&gt;Runner H "AI Agent Prompting" Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I created an &lt;strong&gt;AI-powered&lt;/strong&gt; autonomous product research agent using Runner H, focused on helping &lt;strong&gt;e-commerce sellers&lt;/strong&gt; identify high-potential products for platforms like &lt;strong&gt;Amazon, Etsy, and Shopify&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This Runner H agent performs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trend analysis across platforms (Amazon, TikTok Shopping, Google Trends)&lt;/li&gt;
&lt;li&gt;Product data aggregation (prices, reviews, profit margins)&lt;/li&gt;
&lt;li&gt;Competition scoring&lt;/li&gt;
&lt;li&gt;Supplier discovery&lt;/li&gt;
&lt;li&gt;Launch strategy generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this is saved in a structured PDF and Google Sheet for actionable insights.&lt;/p&gt;

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

&lt;p&gt;Prompt Used&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent Objective:
You are an AI Agent designed to help Amazon sellers identify profitable product opportunities by scanning e-commerce trends, evaluating market demand and competition, and shortlisting suppliers.

Inputs Required:
- A keyword or niche idea (e.g., “portable blender”, “eco-friendly yoga mat”)
- Minimum profit margin (%)
- Minimum monthly search volume
- Maximum competition threshold (scale of 1–10)
- Target region (e.g., US, India)

Tasks:
1. Trend Research:
   - Search Amazon, Google Trends, Etsy, and TikTok Shopping to evaluate the popularity of the keyword.
   - Capture top 5 trending related keywords.
   - Summarize seasonality insights if any (e.g., spikes during summer).

2. Market Evaluation:
   - Find 5 top-selling listings on Amazon for the keyword.
   - Collect price, estimated monthly sales, reviews, rating, and fulfillment type (FBA, FBM).
   - Calculate rough profit margin: (Price – Est. Cost) / Price.
   - Flag products meeting the margin &amp;amp; volume criteria.

3. Competition Analysis:
   - Count total number of sellers.
   - Analyze top 3 sellers’ review counts.
   - Estimate barrier to entry (low/medium/high).
   - Score the competition level from 1–10.

4. Supplier Discovery:
   - Search Alibaba or IndiaMART for potential suppliers.
   - List top 3 suppliers with MOQ, cost per unit, and contact info.

5. Launch Plan Generation:
   - Recommend pricing strategy.
   - Suggest 3 key differentiators or features.
   - Suggest initial launch platform (Amazon, Etsy, own store).
   - List recommended ad budget and keywords.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Youtube Link&lt;/strong&gt;&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/KUpHFZgvwtg"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;RUNNER H LINK : &lt;a href="https://runner.hcompany.ai/chat/a13cb524-1f06-4025-a299-bc5c3ea5a84b/share" rel="noopener noreferrer"&gt;Prompt Link&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Outputs:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cp08g6ut9botuyq48w1.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%2F8cp08g6ut9botuyq48w1.png" alt="Image1"&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%2Fv2dmyob26glqizbl03ot.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%2Fv2dmyob26glqizbl03ot.png" alt="Image2"&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%2Fot44xpv8ytr8t6fppbpr.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%2Fot44xpv8ytr8t6fppbpr.png" alt="Image3"&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%2Frwrrah5kfe4j0v9izlwv.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%2Frwrrah5kfe4j0v9izlwv.png" alt="Image4"&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%2Fehnaqbcl387q9mrg0ce4.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%2Fehnaqbcl387q9mrg0ce4.png" alt="Image5"&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%2Fgg5dbwj3tcrc8bkcuzmz.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%2Fgg5dbwj3tcrc8bkcuzmz.png" alt="Image6"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Write all outputs in a structured PDF with fields matching the Google Sheet schema below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1WPpCRtvmBdC066MRC4qSJsxy1yWhuALV/view?usp=sharing" rel="noopener noreferrer"&gt;Generated PDF&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.google.com/spreadsheets/d/1cJuZwA6zg9X9qXLuaIPjcr5JQ6GeLmp9/edit?gid=690782712#gid=690782712" rel="noopener noreferrer"&gt;AI Market Analysis - Google Sheets&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Runner H
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Workflow Structure&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input Collection&lt;/li&gt;
&lt;li&gt;User enters a niche or product idea (e.g., "phone")&lt;/li&gt;
&lt;li&gt;Trend Analysis (Runner H agent)&lt;/li&gt;
&lt;li&gt;Scrapes Amazon bestsellers, Google Trends, TikTok Shopping&lt;/li&gt;
&lt;li&gt;Extracts seasonality, rising interest, top keywords&lt;/li&gt;
&lt;li&gt;Market Evaluation&lt;/li&gt;
&lt;li&gt;Collects top listings from Amazon (price, reviews, rating)&lt;/li&gt;
&lt;li&gt;Estimates profit margin, average monthly sales&lt;/li&gt;
&lt;li&gt;Assigns a competition score&lt;/li&gt;
&lt;li&gt;Supplier Sourcing&lt;/li&gt;
&lt;li&gt;Pulls top matches from Amazon / IndiaMART with MOQ and pricing&lt;/li&gt;
&lt;li&gt;Launch Strategy Generator&lt;/li&gt;
&lt;li&gt;Recommends pricing, ad budget, key differentiators, and best platform&lt;/li&gt;
&lt;li&gt;Data Export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All data saved to a structured Google Sheet: AI Market Watch – Q2&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Case &amp;amp; Impact
&lt;/h2&gt;

&lt;p&gt;Who it helps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Indie e-commerce founders&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon FBA sellers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Product researchers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DTC brands&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manual product validation is time-consuming. This solution speeds up:&lt;/li&gt;
&lt;li&gt;Market research&lt;/li&gt;
&lt;li&gt;Competitor tracking&lt;/li&gt;
&lt;li&gt;Sourcing suppliers&lt;/li&gt;
&lt;li&gt;Launch planning&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Social Love
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1942117136442490900-631" src="https://platform.twitter.com/embed/Tweet.html?id=1942117136442490900"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1942117136442490900-631');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1942117136442490900&amp;amp;theme=dark"
  }



&lt;br&gt;
Made with ❤️ by Shreya N &lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>runnerhchallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Cloud Networking Showdown: AWS VPC vs. Azure VNET vs. Google Cloud VPC</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Thu, 30 Jan 2025 13:54:14 +0000</pubDate>
      <link>https://forem.com/shreya111111/cloud-networking-showdown-aws-vpc-vs-azure-vnet-vs-google-cloud-vpc-5e61</link>
      <guid>https://forem.com/shreya111111/cloud-networking-showdown-aws-vpc-vs-azure-vnet-vs-google-cloud-vpc-5e61</guid>
      <description>&lt;p&gt;Cloud computing has transformed how businesses operate, and at the heart of most cloud infrastructures are networking solutions. AWS VPC, Azure VNET, and Google Cloud VPC each offer ways to manage and connect virtual networks, but each has its own unique features and nuances. To make this comparison more relatable, let’s explore these cloud networking solutions through a simple analogy—think of them like different types of highways connecting cities (your servers and applications). &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;AWS VPC: The Established Highway System&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;AWS Virtual Private Cloud (VPC) is like a mature, well-maintained highway network—comprehensive, reliable, and familiar to many. AWS VPC gives you full control over your network environment, letting you create isolated virtual networks in the cloud, akin to building your own private highways. &lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Customizable Network:&lt;/strong&gt; You can design your VPC with subnets, route tables, and gateways to control how traffic flows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Features like security groups (firewalls for individual instances) and Network ACLs (access control lists for subnets) offer strong protections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VPC Peering and Transit Gateway:&lt;/strong&gt; You can connect multiple VPCs (think of them as different cities) using peering or Transit Gateways for broader network integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS has a robust ecosystem, with a wide variety of additional networking tools and services, such as Direct Connect (dedicated network links) and PrivateLink (secure access to services), making it a great option for organizations that require flexibility and scalability.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Azure VNET: The Highway with Easy On-Ramps&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Azure’s Virtual Network (VNET) is like a highway system with smooth on-ramps and off-ramps that make it incredibly easy for developers to plug into. If you’re already in the Microsoft ecosystem, Azure VNET is designed with integrations in mind, making it simple to extend your existing Active Directory or hybrid workloads.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ease of Use:&lt;/strong&gt; Azure VNET has built-in integration with many Microsoft tools, making it a seamless option for enterprises using Windows Server, Active Directory, or SQL Server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subnets and Network Security Groups:&lt;/strong&gt; Just like AWS VPC, Azure VNET lets you segment your network into subnets. Network Security Groups (NSGs) are like custom rules that control traffic flow, providing a firewall-like protection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid Connectivity:&lt;/strong&gt; Azure provides strong hybrid connectivity options, including Azure ExpressRoute (similar to AWS Direct Connect) for establishing private connections between on-premises and the cloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While it might not be as feature-packed as AWS VPC, Azure VNET’s tight integration with other Microsoft services makes it ideal for businesses already working with Microsoft technologies.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Google Cloud VPC: The Smart, Adaptive Network&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Google Cloud VPC is like a modern, smart highway system that adapts and grows based on the city’s needs. It’s optimized for simplicity, innovation, and low-latency services, leveraging Google’s expertise in networking and data management.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global Network:&lt;/strong&gt; One of Google Cloud’s standout features is its global VPC. Unlike AWS or Azure, Google VPC allows you to create a single VPC across regions without needing to set up complex inter-region peering. It’s as if you could have a highway that seamlessly connects cities worldwide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple and Flexible:&lt;/strong&gt; Google VPC’s user interface is intuitive, making it easy to set up and manage. The VPC supports both private and public IPs, and firewall rules can be set at the global level, simplifying configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Google Services Access:&lt;/strong&gt; With Private Google Access, you can access Google Cloud services (like Cloud Storage and BigQuery) from within your VPC without needing to use the public internet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google Cloud VPC may not have the same depth of services as AWS or Azure, but it’s perfect for developers and businesses looking for a simple, highly scalable, and globally connected networking solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How They Compare: Highway Systems&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;AWS VPC&lt;/th&gt;
&lt;th&gt;Azure VNET&lt;/th&gt;
&lt;th&gt;Google Cloud VPC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ease of Use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Feature-rich but complex&lt;/td&gt;
&lt;td&gt;Simple with Microsoft integrations&lt;/td&gt;
&lt;td&gt;Highly intuitive, simple setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global Connectivity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited to region-based VPCs&lt;/td&gt;
&lt;td&gt;Region-based, with VPN support&lt;/td&gt;
&lt;td&gt;Global VPC, no need for complex peering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Granular control with SGs, ACLs&lt;/td&gt;
&lt;td&gt;NSGs and firewall rules&lt;/td&gt;
&lt;td&gt;Global firewall rules, customizable access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hybrid Cloud Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Direct Connect and VPN&lt;/td&gt;
&lt;td&gt;ExpressRoute and VPN&lt;/td&gt;
&lt;td&gt;Cloud Interconnect and VPN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strong ecosystem, many tools&lt;/td&gt;
&lt;td&gt;Best for Microsoft-heavy environments&lt;/td&gt;
&lt;td&gt;Seamless integration with Google services&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion: Which Highway is Right for You?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Choosing between AWS VPC, Azure VNET, and Google Cloud VPC boils down to your specific needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS VPC&lt;/strong&gt; is ideal if you need a comprehensive, highly customizable, and scalable network, especially if you're dealing with complex applications or large enterprises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure VNET&lt;/strong&gt; is a solid choice for businesses heavily invested in Microsoft technologies, as it integrates seamlessly with on-premises solutions and Microsoft cloud tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud VPC&lt;/strong&gt; stands out if you need a global, simple, and high-performance network with ease of use and tight integration with Google Cloud services, especially for big data or machine learning workloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just like choosing the right highway depends on where you need to go, selecting the right cloud provider’s networking solution depends on your company’s goals, existing infrastructure, and long-term strategy.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>learning</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>DBaaS Unleashed: Exploring DyanamoDB &amp; RDS in the AWS</title>
      <dc:creator>Shreya Nalawade</dc:creator>
      <pubDate>Tue, 31 Dec 2024 18:29:27 +0000</pubDate>
      <link>https://forem.com/shreya111111/dbaas-unleashed-exploring-dyanamodb-rds-in-the-aws-3c8d</link>
      <guid>https://forem.com/shreya111111/dbaas-unleashed-exploring-dyanamodb-rds-in-the-aws-3c8d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Database As A Service:&lt;/strong&gt;&lt;br&gt;
Database as a service (DBaaS) is a cloud computing managed service offering that provides access to a database without requiring the setup of physical hardware, the installation of software, or the need to configure the database. Most maintenance and administrative tasks are handled by the service provider, freeing up users to quickly benefit from using the database. DBaaS uses The DBaaS model is ideal for small to medium-sized businesses that do not have well-staffed IT departments. Offloading the service and maintenance of the database to the DBaaS provider enables small to medium-sized businesses to implement applications and systems that they otherwise could not afford to build and support on-premises. Workloads involving data with stringent regulatory requirements may not be suitable for a  DBaaS model. Furthermore, mission-critical applications that require optimal performance and 99.999% of uptime may be better suited for on-premises implementation. This is not to say that mission-critical workloads cannot run on cloud services, but much of the DBaaS adoption to date has been for less crucial applications, such as development and pilot programs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Detailed Implementation Steps: DynamoDB
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step 1: Select Database in AWS Services&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Log in to the AWS Management Console.
&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Services&lt;/strong&gt; in the top menu.
&lt;/li&gt;
&lt;li&gt;Under the &lt;strong&gt;Database&lt;/strong&gt; category, select &lt;strong&gt;DynamoDB&lt;/strong&gt;.

&lt;ul&gt;
&lt;li&gt;DynamoDB is a fully managed NoSQL database service designed for high availability and scalability.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2Fm8l2nuoxz581gje6idnj.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%2Fm8l2nuoxz581gje6idnj.png" alt="AWS_1" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Step 2: Go to DynamoDB Dashboard&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Once inside DynamoDB, you'll see the dashboard where you can manage tables, monitor usage, and configure settings.
&lt;/li&gt;
&lt;li&gt;Familiarize yourself with the key sections, such as Tables, Metrics, and Global Tables, for future use.
&lt;/li&gt;
&lt;/ol&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%2Fwtbzftb1tovl343up7jz.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%2Fwtbzftb1tovl343up7jz.png" alt="AWS_2" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Step 3: Create a Table&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;"Create Table"&lt;/strong&gt; to open the table creation wizard.
&lt;/li&gt;
&lt;li&gt;Provide a &lt;strong&gt;Table Name&lt;/strong&gt; (e.g., &lt;code&gt;MyFirstTable&lt;/code&gt;). This must be unique within your AWS account.
&lt;/li&gt;
&lt;li&gt;Define the &lt;strong&gt;Primary Key&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Partition Key&lt;/strong&gt;: The unique identifier for each item (e.g., &lt;code&gt;UserID&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sort Key&lt;/strong&gt; (Optional): Used to sort items with the same Partition Key (e.g., &lt;code&gt;OrderDate&lt;/code&gt;).
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configure additional settings (optional):

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Provisioned Throughput&lt;/strong&gt;: Choose between "On-Demand" or "Provisioned" based on expected traffic.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encryption&lt;/strong&gt;: Enable encryption at rest for enhanced security.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Secondary Indexes (GSIs)&lt;/strong&gt; or &lt;strong&gt;Local Secondary Indexes (LSIs)&lt;/strong&gt; can be added for optimized querying.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Create Table"&lt;/strong&gt; to initiate table creation. It may take a few moments for the table to be ready.
&lt;/li&gt;
&lt;/ol&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%2Flmhnhntt5xfb0ra9thuc.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%2Flmhnhntt5xfb0ra9thuc.png" alt="AWS_3" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Step 4: Confirm Table Creation&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Once the table is created, it will appear in the &lt;strong&gt;Tables&lt;/strong&gt; list.
&lt;/li&gt;
&lt;li&gt;Click on the table name to view its details, including schema, items, metrics, and indexes.
&lt;/li&gt;
&lt;/ol&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%2Feu3bsi1se4rez6x07c4j.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%2Feu3bsi1se4rez6x07c4j.png" alt="AWS_4" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Step 5: Add Items to the Table&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;Items&lt;/strong&gt; tab within your table.
&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Actions&lt;/strong&gt;, click &lt;strong&gt;Create Item&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&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%2F7t5ypinenq2d1oen9op9.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%2F7t5ypinenq2d1oen9op9.png" alt="AWS_5" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Step 6: Enter Item Data&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;Create Item&lt;/strong&gt; interface will open.
&lt;/li&gt;
&lt;li&gt;Enter values for the Partition Key and Sort Key (if applicable).

&lt;ul&gt;
&lt;li&gt;Example: &lt;code&gt;UserID&lt;/code&gt; = "12345", &lt;code&gt;OrderDate&lt;/code&gt; = "2024-01-01".
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add additional attributes as key-value pairs, such as:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Name&lt;/code&gt; = "John Doe"
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Email&lt;/code&gt; = "&lt;a href="mailto:john.doe@example.com"&gt;john.doe@example.com&lt;/a&gt;"
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;OrderAmount&lt;/code&gt; = 150.25
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Once all required attributes are added, click &lt;strong&gt;Save&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&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%2Fc7nryyw5u1zbf1ltspjy.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%2Fc7nryyw5u1zbf1ltspjy.png" alt="AWS_6" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Step 7: View and Explore Items&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Go back to the &lt;strong&gt;Items&lt;/strong&gt; tab.
&lt;/li&gt;
&lt;li&gt;You’ll see a list of all items in the table.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Step 8: Query and Filter Data&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;Explore Items&lt;/strong&gt; section, use the &lt;strong&gt;Scan&lt;/strong&gt; operation to retrieve all items in the table.
&lt;/li&gt;
&lt;li&gt;Apply filters to refine your results:

&lt;ul&gt;
&lt;li&gt;Example: Filter items where &lt;code&gt;OrderAmount &amp;gt; 100&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use the Query operation for more precise lookups, especially if your table has a Sort Key.
&lt;/li&gt;
&lt;/ol&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%2Fs18m5ev8yr9kjtcbnfdq.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%2Fs18m5ev8yr9kjtcbnfdq.png" alt="AWS_7" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Step 9: Monitor Table Metrics&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;Metrics&lt;/strong&gt; tab to view performance data, such as read/write capacity usage, throttling events, and storage utilization.
&lt;/li&gt;
&lt;li&gt;Adjust provisioned throughput if necessary to optimize performance.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Step 10: Delete the Table&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to the DynamoDB dashboard and select the table you created.
&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Actions&lt;/strong&gt;, choose &lt;strong&gt;Delete Table&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Confirm the deletion in the pop-up dialog.

&lt;ul&gt;
&lt;li&gt;Note: Deleting a table is irreversible and removes all associated data.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2F5g1z9vqi0gh9z5iia8fd.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%2F5g1z9vqi0gh9z5iia8fd.png" alt="AWS_8" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Detailed Implementation Steps: RDS
&lt;/h3&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%2Fxl1ig2bssmh9zls44u9m.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%2Fxl1ig2bssmh9zls44u9m.png" alt="rds1" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step 11: Navigate to AWS RDS&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Log in to your AWS Management Console.
&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Services&lt;/strong&gt; in the top menu bar.
&lt;/li&gt;
&lt;li&gt;Under the &lt;strong&gt;Database&lt;/strong&gt; section, select &lt;strong&gt;RDS&lt;/strong&gt;.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RDS (Relational Database Service)&lt;/strong&gt; is a fully managed service that allows you to easily set up, operate, and scale a relational database in the cloud. It supports multiple database engines, including MySQL, PostgreSQL, Oracle, SQL Server, and Amazon Aurora.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Step 12: Create a Database in RDS&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Once inside the RDS dashboard, click on &lt;strong&gt;"Databases"&lt;/strong&gt; in the left navigation panel.
&lt;/li&gt;
&lt;li&gt;Click on the &lt;strong&gt;"Create database"&lt;/strong&gt; button to start the database creation process.
&lt;/li&gt;
&lt;/ol&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%2Faj6ol5jt31gvcx4rbjp7.png" alt="rds2" width="800" height="449"&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 13: Configure Database Settings&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Select the Database Engine&lt;/strong&gt;:
Choose the database engine you wish to use (e.g., MySQL, PostgreSQL, MariaDB, etc.).

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: Select &lt;strong&gt;MySQL&lt;/strong&gt; for a relational database setup. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2F1yuo3t13djdk3b3kd8se.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%2F1yuo3t13djdk3b3kd8se.png" alt="rds3" width="800" height="449"&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%2F8bpwjw988tsxw3ekvfnb.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%2F8bpwjw988tsxw3ekvfnb.png" alt="rds4" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Choose a Template&lt;/strong&gt;:
You can choose between:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Production&lt;/strong&gt;: For highly available and scalable environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev/Test&lt;/strong&gt;: For lower cost, non-production environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free Tier&lt;/strong&gt;: If you're eligible, this option provides limited free usage (1 GB of storage, 20 GB backup).
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2Fal0628shjnrka23lkq2x.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%2Fal0628shjnrka23lkq2x.png" alt="rds5" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Settings&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DB Instance Identifier&lt;/strong&gt;: Choose a unique name for the instance (e.g., &lt;code&gt;mydatabaseinstance&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Master Username&lt;/strong&gt;: Choose a username for the database administrator (e.g., &lt;code&gt;admin&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Master Password&lt;/strong&gt;: Enter a strong password and confirm it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2Fi161erh7qnpp45g6u904.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%2Fi161erh7qnpp45g6u904.png" alt="rds5" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;DB Instance Class&lt;/strong&gt;:
Select the instance size (e.g., &lt;code&gt;db.t3.micro&lt;/code&gt; for smaller, cost-effective setups or larger instance sizes for production workloads).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Storage Type&lt;/strong&gt;: Choose between General Purpose (SSD) or Provisioned IOPS (SSD) for higher performance.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allocated Storage&lt;/strong&gt;: Set the size for your database storage (e.g., 20 GB).
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VPC and Network Configuration&lt;/strong&gt;:
Choose the &lt;strong&gt;VPC&lt;/strong&gt; (Virtual Private Cloud) in which the RDS instance will run.

&lt;ul&gt;
&lt;li&gt;Ensure you select the correct &lt;strong&gt;subnet group&lt;/strong&gt; and security group. This will define the network and access permissions for the database.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup and Maintenance&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Set the &lt;strong&gt;Backup Retention Period&lt;/strong&gt; (how long backups are kept).
&lt;/li&gt;
&lt;li&gt;Configure &lt;strong&gt;Automated Backups&lt;/strong&gt;, &lt;strong&gt;Multi-AZ Deployment&lt;/strong&gt;, and &lt;strong&gt;Maintenance&lt;/strong&gt; window if needed.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Create Database&lt;/strong&gt; to start the database creation process.

&lt;ul&gt;
&lt;li&gt;Note: The process may take a few minutes to complete.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2F2u4e68wz6hnlyr8f118w.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%2F2u4e68wz6hnlyr8f118w.png" alt="rds6" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Step 14: Access the Database Instance&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;After the database instance is created, click on the &lt;strong&gt;Database name&lt;/strong&gt; (e.g., &lt;code&gt;mydatabaseinstance&lt;/code&gt;) in the &lt;strong&gt;Databases&lt;/strong&gt; tab to view its details.
&lt;/li&gt;
&lt;li&gt;You can see important information such as:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint&lt;/strong&gt;: The address you will use to connect to the database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VPC Security Group&lt;/strong&gt;: The security group that controls access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DB Parameter Group&lt;/strong&gt;: Configuration settings that define behavior of the database.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;From this page, you can monitor performance, set up additional options, and access the database instance’s logs.
&lt;/li&gt;
&lt;/ol&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%2Fmb7i8x9ifmxl8fn2a226.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%2Fmb7i8x9ifmxl8fn2a226.png" alt="rds7" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Step 15: Delete the Database Instance&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;To delete the database instance, go to the &lt;strong&gt;Databases&lt;/strong&gt; page in the RDS dashboard.
&lt;/li&gt;
&lt;li&gt;Select the database instance you want to delete (e.g., &lt;code&gt;mydatabaseinstance&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;Actions&lt;/strong&gt; dropdown menu, select &lt;strong&gt;Delete&lt;/strong&gt;.

&lt;ul&gt;
&lt;li&gt;A confirmation window will appear asking if you’re sure about deleting the instance.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You will be prompted to:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a final snapshot&lt;/strong&gt; (optional). You can choose to create a snapshot before deletion if you wish to back up the database’s current state.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retain automated backups&lt;/strong&gt;: You can also choose whether to keep automated backups after deletion.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Delete&lt;/strong&gt; to start the deletion process.

&lt;ul&gt;
&lt;li&gt;The deletion of the instance may take some time, depending on the instance size and configuration.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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%2Fnt8zkmusde2h4q0z3e0s.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%2Fnt8zkmusde2h4q0z3e0s.png" alt="rds8" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VPC Settings&lt;/strong&gt;: Be cautious about the &lt;strong&gt;VPC&lt;/strong&gt; (Virtual Private Cloud) settings as this dictates which resources can access your RDS instance. If your VPC is misconfigured, it may block the connection to your database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backups&lt;/strong&gt;: Before deleting any instance, ensure that you have backed up any important data, as deleting the database is irreversible if you don’t retain backups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: After creation, use the &lt;strong&gt;CloudWatch&lt;/strong&gt; monitoring tool to keep track of database performance (CPU usage, memory consumption, etc.).&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
