<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ramesh Reddy Adutla</title>
    <description>The latest articles on DEV Community by Ramesh Reddy Adutla (@rameshreddy-adutla).</description>
    <link>https://dev.to/rameshreddy-adutla</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%2F3806580%2F79f70e93-53c6-4437-88e5-8b41a5becc02.jpeg</url>
      <title>DEV Community: Ramesh Reddy Adutla</title>
      <link>https://dev.to/rameshreddy-adutla</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rameshreddy-adutla"/>
    <language>en</language>
    <item>
      <title>I Built a Free AI Education Platform in 10 Languages — And Open-Sourced Everything</title>
      <dc:creator>Ramesh Reddy Adutla</dc:creator>
      <pubDate>Mon, 09 Mar 2026 19:01:11 +0000</pubDate>
      <link>https://dev.to/rameshreddy-adutla/i-built-a-free-ai-education-platform-in-5-languages-and-open-sourced-everything-1a73</link>
      <guid>https://dev.to/rameshreddy-adutla/i-built-a-free-ai-education-platform-in-5-languages-and-open-sourced-everything-1a73</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Free AI Education Platform in 10 Languages — And Open-Sourced Everything
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aieducademy.org" rel="noopener noreferrer"&gt;AI Educademy&lt;/a&gt;&lt;/strong&gt; is a free, open-source AI education platform I conceived, designed, and built entirely from scratch — every line of code, every lesson, every language.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎓 &lt;strong&gt;112+ interactive lessons&lt;/strong&gt; across 3 difficulty tracks (Seeds → Sprouts → Branches)&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;18 SEO blog posts&lt;/strong&gt; covering AI fundamentals, career paths, ethics, and more&lt;/li&gt;
&lt;li&gt;🌍 &lt;strong&gt;10 languages&lt;/strong&gt;: English, French, Dutch, Hindi, Telugu, Spanish, Portuguese, German, Chinese, Japanese (Arabic coming next)&lt;/li&gt;
&lt;li&gt;🔬 &lt;strong&gt;AI Lab / Playground&lt;/strong&gt; — hands-on experiments, no setup needed&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;97 PageSpeed score&lt;/strong&gt; on desktop, 97 on mobile — zero Framer Motion, CSS-only animations&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;FAQ page&lt;/strong&gt; with schema.org markup for Google rich results&lt;/li&gt;
&lt;li&gt;📑 &lt;strong&gt;Blog table of contents&lt;/strong&gt; — auto-generated from headings, sticky sidebar on desktop&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;100 Best Practices, 100 SEO&lt;/strong&gt; on Lighthouse&lt;/li&gt;
&lt;li&gt;Built with &lt;strong&gt;Next.js 15&lt;/strong&gt;, TypeScript, MDX, Tailwind CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;AI will reshape every industry. Yet the best AI education remains locked behind expensive institutions in a handful of countries. I've worked across Asia and Europe — in fintech, media, and retail — and it's clear: language should never be a barrier to learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tech stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Next.js 15 (App Router) + TypeScript
next-intl — i18n routing for 10 locales
MDX — content as code (lessons + blog)
Tailwind CSS — zero runtime CSS-in-JS
Vercel — deployment &amp;amp; analytics
Vitest — 122 unit tests
GitHub Actions — CI on every push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Arabic (RTL support already built in)&lt;/li&gt;
&lt;li&gt;More lessons across all 3 tracks&lt;/li&gt;
&lt;li&gt;Spanish, Portuguese, Hindi blog post translations&lt;/li&gt;
&lt;li&gt;Community contributions welcome!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open source
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Platform: &lt;a href="https://github.com/ai-educademy/ai-platform" rel="noopener noreferrer"&gt;github.com/ai-educademy/ai-platform&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Content: &lt;a href="https://github.com/ai-educademy/ai-courses" rel="noopener noreferrer"&gt;github.com/ai-educademy/ai-courses&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this resonates with you, ⭐ the repo or share it with someone who wants to learn AI in their own language.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built solo, shipped with ❤️ from London.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>nextjs</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Free, Multilingual AI Education Platform — Here's How 🌍🤖</title>
      <dc:creator>Ramesh Reddy Adutla</dc:creator>
      <pubDate>Fri, 06 Mar 2026 14:09:47 +0000</pubDate>
      <link>https://dev.to/rameshreddy-adutla/i-built-a-free-multilingual-ai-education-platform-heres-how-443j</link>
      <guid>https://dev.to/rameshreddy-adutla/i-built-a-free-multilingual-ai-education-platform-heres-how-443j</guid>
      <description>&lt;h2&gt;
  
  
  What if anyone in the world could learn AI — for free, in their own language?
&lt;/h2&gt;

&lt;p&gt;That question kept nagging me.&lt;/p&gt;

&lt;p&gt;I'm an engineering leader who's spent years building systems at scale. But when I looked at the AI education landscape, I saw the same pattern repeating: great content locked behind paywalls, taught exclusively in English, and assuming you already have a CS degree.&lt;/p&gt;

&lt;p&gt;My mother speaks Telugu. My colleague's parents speak Hindi. A friend in Brussels works in Dutch. None of them could find a single, structured AI course in their own language that didn't cost hundreds of dollars.&lt;/p&gt;

&lt;p&gt;So I built one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Educademy&lt;/strong&gt; is a free, open-source platform that teaches AI from absolute zero to production mastery — in 5 languages, with 10 progressive programs, powered by a modern Next.js stack.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://aieducademy.vercel.app" rel="noopener noreferrer"&gt;aieducademy.vercel.app&lt;/a&gt;&lt;br&gt;
⭐ &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ai-educademy/ai-platform" rel="noopener noreferrer"&gt;github.com/ai-educademy/ai-platform&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Problem Nobody's Solving
&lt;/h2&gt;

&lt;p&gt;Here's what I found when I surveyed AI education:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fragmented&lt;/strong&gt; — YouTube playlists, random blog posts, half-finished Udemy courses. No coherent path from "What is AI?" to "Deploy an ML pipeline."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;English-only&lt;/strong&gt; — 75% of the world doesn't speak English as a first language. If you're a curious teenager in Hyderabad or a career-changer in Lyon, your options are... limited.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paywalled&lt;/strong&gt; — The best structured courses cost $50–$500. That's a month's salary in some countries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assumes prerequisites&lt;/strong&gt; — Most courses start with "Let's import TensorFlow" before explaining what a neural network actually &lt;em&gt;is&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI is going to reshape every industry. The people building it — and the people affected by it — shouldn't need a credit card and fluent English to understand it.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Solution: AI Educademy 🌱→🌲
&lt;/h2&gt;

&lt;p&gt;AI Educademy uses a &lt;strong&gt;nature growth metaphor&lt;/strong&gt;. You start as a seed and grow into a forest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🌱 AI Seeds        → "What is AI?" (no code, no maths)
🌿 AI Sprouts      → Foundations (data, algorithms, neural nets)
🌳 AI Branches     → Specialisations (ML, CV, NLP, GenAI)
🏕️ AI Canopy       → Production AI (MLOps, RAG, governance)
🌲 AI Forest       → Mastery (research, leadership, frontier AI)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plus a parallel &lt;strong&gt;craft-engineering&lt;/strong&gt; track for building real AI products:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✏️ AI Sketch       → Design thinking for AI products
🪨 AI Chisel       → Engineering fundamentals
⚒️ AI Craft        → Building real AI systems
💎 AI Polish       → Production-grade refinement
🏆 AI Masterpiece  → Capstone portfolio projects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;10 programs. 2 tracks. 5 languages. 150+ MDX lessons. All free. All open source.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every lesson is available in English 🇬🇧, French 🇫🇷, Dutch 🇳🇱, Hindi 🇮🇳, and Telugu 🇮🇳 — with a content fallback chain so missing translations gracefully degrade to English.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Deep Dive 🏗️
&lt;/h2&gt;

&lt;p&gt;This is the part you're here for. Let me walk through the key technical decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Next.js App Router + next-intl
&lt;/h3&gt;

&lt;p&gt;The platform runs on &lt;strong&gt;Next.js&lt;/strong&gt; with the App Router. Every route is locale-aware via &lt;code&gt;next-intl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/app/[locale]/
├── page.tsx                              # Homepage
├── programs/[programSlug]/
│   └── lessons/[slug]/page.tsx           # Lesson viewer
├── dashboard/page.tsx                    # Progress tracking
├── playground/page.tsx                   # AI games
└── about/page.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;[locale]&lt;/code&gt; segment is handled by &lt;code&gt;next-intl&lt;/code&gt; middleware, which detects the browser language, matches it against supported locales (&lt;code&gt;en&lt;/code&gt;, &lt;code&gt;fr&lt;/code&gt;, &lt;code&gt;nl&lt;/code&gt;, &lt;code&gt;hi&lt;/code&gt;, &lt;code&gt;te&lt;/code&gt;), and routes accordingly. A &lt;code&gt;LanguageSwitcher&lt;/code&gt; component lets users override at any time.&lt;/p&gt;

&lt;h3&gt;
  
  
  MDX Content System
&lt;/h3&gt;

&lt;p&gt;Each lesson is an MDX file with rich frontmatter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
title: "What is AI? A Friendly Introduction"
description: "No jargon, no maths — just a simple explanation..."
order: 1
difficulty: "beginner"
duration: 10
icon: "🤖"
published: true
---

## Welcome! 👋

If you've ever heard people talk about "AI" and thought
_"What even is that?"_ — you're in exactly the right place.

&amp;lt;Illustration
  src="/images/lessons/what-is-ai.svg"
  alt="Traditional software follows rules. AI learns patterns."
  caption="The core difference: rules vs learning"
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MDX gives us the best of both worlds: authors write in Markdown (low barrier), but we can embed React components like &lt;code&gt;&amp;lt;Illustration&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Quiz&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;CodePlayground&amp;gt;&lt;/code&gt; directly in lesson content.&lt;/p&gt;

&lt;p&gt;We use &lt;code&gt;next-mdx-remote&lt;/code&gt; for rendering and &lt;code&gt;gray-matter&lt;/code&gt; for frontmatter parsing at build time.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Content Fallback Chain
&lt;/h3&gt;

&lt;p&gt;This was a key design decision. Not every lesson has been translated into all 5 languages yet. So the content loader implements a fallback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simplified from src/lib/lessons.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getLesson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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;localePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`content/programs/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/lessons/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;locale&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="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.mdx`&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;enPath&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`content/programs/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/lessons/en/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.mdx`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Try locale-specific first, fall back to English&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;existsSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;localePath&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;enPath&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;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;utf-8&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="p"&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="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;matter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&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="na"&gt;meta&lt;/span&gt;&lt;span class="p"&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means contributors can translate &lt;em&gt;one lesson at a time&lt;/em&gt; without breaking anything. The platform always works — it just gracefully degrades to English for untranslated content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Git Submodules: The Secret Sauce
&lt;/h3&gt;

&lt;p&gt;Here's what makes the architecture scale. Each of the 10 programs is its own GitHub repo, pulled into the platform via &lt;strong&gt;git submodules&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;ai-platform/content/programs/
├── ai-seeds/          ← github.com/ai-educademy/ai-courses
├── ai-sprouts/        ← github.com/ai-educademy/ai-courses
├── ai-branches/       ← github.com/ai-educademy/ai-courses
├── ai-sketch/         ← github.com/ai-educademy/ai-courses
├── ai-chisel/         ← github.com/ai-educademy/ai-courses
├── ai-craft/          ← github.com/ai-educademy/ai-courses
├── ai-polish/         ← github.com/ai-educademy/ai-courses
├── ai-canopy/         ← github.com/ai-educademy/ai-courses
├── ai-forest/         ← github.com/ai-educademy/ai-courses
└── ai-masterpiece/    ← github.com/ai-educademy/ai-courses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why submodules over a monorepo?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Independent versioning&lt;/strong&gt; — Content authors can work on &lt;code&gt;ai-seeds&lt;/code&gt; without touching platform code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate permissions&lt;/strong&gt; — Translators get write access to content repos only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-deploy&lt;/strong&gt; — Each content repo has a GitHub Action that fires &lt;code&gt;repository_dispatch&lt;/code&gt; to the platform repo, triggering a Vercel rebuild. Content changes go live in ~60 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean separation&lt;/strong&gt; — The platform is the &lt;em&gt;shell&lt;/em&gt;; content is pluggable. Want to add a new program? Create a repo, add a submodule, register it in &lt;code&gt;programs.json&lt;/code&gt;. Done.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Shared Design System
&lt;/h3&gt;

&lt;p&gt;All UI components come from &lt;a href="https://www.npmjs.com/package/@ai-educademy/ai-ui-lib" rel="noopener noreferrer"&gt;&lt;code&gt;@ai-educademy/ai-ui-lib&lt;/code&gt;&lt;/a&gt; — a separate npm package with its own &lt;a href="https://ai-educademy.github.io/ai-ui-lib/" rel="noopener noreferrer"&gt;Storybook&lt;/a&gt;. The platform consumes it; the content repos don't need to know about it. Consistent design across everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  PWA + Offline Support
&lt;/h3&gt;

&lt;p&gt;The platform is a Progressive Web App powered by &lt;strong&gt;Serwist&lt;/strong&gt; (a modern Workbox wrapper for Next.js). Users in areas with spotty internet can install it and access cached lessons offline. For an education platform targeting global learners, this isn't a nice-to-have — it's essential.&lt;/p&gt;

&lt;h3&gt;
  
  
  CI/CD Pipeline
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Push to main (or content repo dispatch)
    ↓
GitHub Actions CI
    ├── ESLint (strict TypeScript)
    ├── Next.js production build
    └── Playwright e2e tests (multi-browser)
    ↓
Vercel auto-deploy → aieducademy.vercel.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Here's how 150+ MDX files are organized across 10 programs × 5 locales:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;content/programs/
└── ai-seeds/                    # Each program = one git repo
    ├── lessons/
    │   ├── en/                  # English (canonical source)
    │   │   ├── what-is-ai.mdx
    │   │   ├── how-machines-learn.mdx
    │   │   └── your-first-ai-model.mdx
    │   ├── fr/                  # 🇫🇷 French translations
    │   │   ├── what-is-ai.mdx
    │   │   ├── how-machines-learn.mdx
    │   │   └── your-first-ai-model.mdx
    │   ├── nl/                  # 🇳🇱 Dutch
    │   ├── hi/                  # 🇮🇳 Hindi
    │   └── te/                  # 🇮🇳 Telugu
    ├── assets/                  # Illustrations, diagrams
    └── program.json             # Program metadata
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The slug-based naming (&lt;code&gt;what-is-ai.mdx&lt;/code&gt;) means the same slug resolves across all locales. The platform's &lt;code&gt;programs.json&lt;/code&gt; registry ties everything together:&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;"programs"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"slug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai-seeds"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"icon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"track"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai-learning"&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;span class="nl"&gt;"slug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai-sprouts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"icon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"track"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai-learning"&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;span class="nl"&gt;"slug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai-sketch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"icon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"track"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"craft-engineering"&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;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;p&gt;Adding a new program to the platform is literally: add one JSON entry, add one git submodule. The routing, i18n, and lesson rendering all work automatically.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;🎮 AI Playground&lt;/strong&gt; — An interactive drawing recogniser where you sketch objects and a pre-trained model guesses what you drew. It's the "Hello World" of experiencing AI firsthand — no installation, no setup, just draw.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📊 Dashboard&lt;/strong&gt; — Track progress across all programs. Completion percentages, learning streaks, and certificates for finished programs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌙 Dark / Light Mode&lt;/strong&gt; — System preference detection with a manual toggle. Because we're developers and dark mode is non-negotiable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔐 Auth + Guest Mode&lt;/strong&gt; — GitHub OAuth via NextAuth.js for persistent profiles, but you can also learn as a guest with localStorage-based progress. Zero friction to start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎨 Smooth Animations&lt;/strong&gt; — Framer Motion powers page transitions and micro-interactions throughout the platform. It feels &lt;em&gt;good&lt;/em&gt; to use.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Decisions &amp;amp; Trade-offs
&lt;/h2&gt;

&lt;p&gt;Every architecture has trade-offs. Here are mine, honestly:&lt;/p&gt;

&lt;h3&gt;
  
  
  MDX over a CMS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Content lives in git. Version control, PR-based reviews, no vendor lock-in, and contributors use their existing GitHub workflow.&lt;br&gt;
&lt;strong&gt;Trade-off:&lt;/strong&gt; No WYSIWYG editor. For a developer-oriented open-source project, that's actually a feature, not a bug.&lt;/p&gt;

&lt;h3&gt;
  
  
  Git submodules over a monorepo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Content and code have different lifecycles, different contributors, and different release cadences.&lt;br&gt;
&lt;strong&gt;Trade-off:&lt;/strong&gt; Submodules have a learning curve. &lt;code&gt;git clone --recurse-submodules&lt;/code&gt; isn't intuitive for newcomers. But for independently versioned content plugged into a shell — they're the right tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  localStorage for the MVP
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Zero backend. No database to manage, no server costs, no GDPR headaches. Users start learning in 2 seconds without signing up.&lt;br&gt;
&lt;strong&gt;Trade-off:&lt;/strong&gt; Progress doesn't sync across devices. That's the first thing I'll upgrade — likely with a lightweight backend or edge-based storage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vercel for deployment
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Generous free tier, edge functions work great with &lt;code&gt;next-intl&lt;/code&gt;, and git-push-to-deploy is frictionless.&lt;br&gt;
&lt;strong&gt;Trade-off:&lt;/strong&gt; Vendor dependency. But the app is standard Next.js — porting to Docker or any Node.js host would take an afternoon.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;i18n is hard. Multilingual &lt;em&gt;content&lt;/em&gt; is really hard.&lt;/strong&gt; The routing and message files were straightforward with &lt;code&gt;next-intl&lt;/code&gt;. The hard part is creating quality translations at scale — culturally appropriate, not just machine-translated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Content architecture matters more than code architecture.&lt;/strong&gt; I spent more time designing the MDX structure, frontmatter schema, and fallback chain than the React components. Get the content system right, and everything else follows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Git submodules have a bad reputation they partly deserve.&lt;/strong&gt; But for this specific use case — pluggable content repositories with independent CI — they're genuinely the best tool.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PWA support in Next.js has matured beautifully.&lt;/strong&gt; Serwist made offline support almost trivial. For education platforms targeting users with unreliable internet, this is a game-changer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open source is a multiplier.&lt;/strong&gt; Within weeks, I had contributors offering translations in languages I hadn't even considered. The community effect is real — and humbling.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  How You Can Help ⭐
&lt;/h2&gt;

&lt;p&gt;If you've read this far, you probably care about making tech education accessible. Here's how to get involved:&lt;/p&gt;

&lt;h3&gt;
  
  
  🌍 Contribute a translation
&lt;/h3&gt;

&lt;p&gt;Every lesson translated is another person who can learn AI in their language. Even one lesson helps. The MDX format is just Markdown — you don't need to be a developer.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⭐ Star the repo
&lt;/h3&gt;

&lt;p&gt;Stars drive discoverability on GitHub. More stars → more contributors → more languages → more learners.&lt;/p&gt;

&lt;h3&gt;
  
  
  📢 Share it
&lt;/h3&gt;

&lt;p&gt;Know someone learning AI? Someone who teaches? Someone who speaks French, Dutch, Hindi, or Telugu? Send them the link.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ Contribute code
&lt;/h3&gt;

&lt;p&gt;The platform is Next.js + TypeScript + Tailwind. The design system has a Storybook. If you can build React components, you can improve AI Educademy.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🔗 Links:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🚀 &lt;strong&gt;Live platform&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aieducademy.vercel.app" rel="noopener noreferrer"&gt;aieducademy.vercel.app&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⭐ &lt;strong&gt;GitHub&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/ai-educademy/ai-platform" rel="noopener noreferrer"&gt;github.com/ai-educademy/ai-platform&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎨 &lt;strong&gt;Storybook&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ai-educademy.github.io/ai-ui-lib/" rel="noopener noreferrer"&gt;ai-educademy.github.io/ai-ui-lib&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📦 &lt;strong&gt;npm&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.npmjs.com/package/@ai-educademy/ai-ui-lib" rel="noopener noreferrer"&gt;@ai-educademy/ai-ui-lib&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;AI education shouldn't be a privilege. Let's make it a right.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built with ❤️ by &lt;a href="https://github.com/ARemeshReddy" rel="noopener noreferrer"&gt;Ramesh Reddy Adutla&lt;/a&gt; — engineering leader, open-source advocate, and believer in education without borders.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>nextjs</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Free AI Education Platform for the World — Heres How You Can Help 🌱</title>
      <dc:creator>Ramesh Reddy Adutla</dc:creator>
      <pubDate>Wed, 04 Mar 2026 23:33:55 +0000</pubDate>
      <link>https://dev.to/rameshreddy-adutla/i-built-a-free-ai-school-for-the-world-heres-how-you-can-help-4hpf</link>
      <guid>https://dev.to/rameshreddy-adutla/i-built-a-free-ai-school-for-the-world-heres-how-you-can-help-4hpf</guid>
      <description>&lt;p&gt;Last year, I noticed something frustrating: most quality AI education is either in English only, locked behind expensive paywalls, or assumes you already have a CS degree.&lt;/p&gt;

&lt;p&gt;As someone from India, I know firsthand how many brilliant students are left behind simply because they don't have access to resources in their language.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;AI Educademy&lt;/strong&gt; — a free, open-source, multilingual platform to learn AI from absolute scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AI Educademy?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌍 &lt;strong&gt;5 languages&lt;/strong&gt; — English, French, Dutch, Hindi, Telugu (more coming!)&lt;/li&gt;
&lt;li&gt;🧪 &lt;strong&gt;Interactive&lt;/strong&gt; — AI Playground with TensorFlow.js (draw something, watch AI recognise it!)&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Mobile-first&lt;/strong&gt; — works on any device&lt;/li&gt;
&lt;li&gt;💝 &lt;strong&gt;Free forever&lt;/strong&gt; — MIT licensed, no paywalls, no ads&lt;/li&gt;
&lt;li&gt;🔓 &lt;strong&gt;Open source&lt;/strong&gt; — built with Next.js 15, TypeScript, TailwindCSS&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Next.js 15&lt;/td&gt;
&lt;td&gt;Framework (App Router, Server Components)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;Type safety&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TailwindCSS&lt;/td&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;next-intl&lt;/td&gt;
&lt;td&gt;Internationalisation (i18n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MDX&lt;/td&gt;
&lt;td&gt;Lesson content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TensorFlow.js&lt;/td&gt;
&lt;td&gt;In-browser AI demos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How You Can Help
&lt;/h2&gt;

&lt;p&gt;We have &lt;strong&gt;good first issues&lt;/strong&gt; waiting for contributors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🇯🇵 Add Japanese support&lt;/li&gt;
&lt;li&gt;🇸🇦 Add Arabic support (RTL!)&lt;/li&gt;
&lt;li&gt;🇩🇪 Add German support&lt;/li&gt;
&lt;li&gt;🇪🇸 Add Spanish support&lt;/li&gt;
&lt;li&gt;🎨 Add dark mode&lt;/li&gt;
&lt;li&gt;📊 Add progress tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No AI knowledge needed to translate — just your language skills!&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/ai-educademy/ai-platform" rel="noopener noreferrer"&gt;github.com/ai-educademy/ai-platform&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;&lt;a href="https://aieducademy.vercel.app" rel="noopener noreferrer"&gt;aieducademy.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Star ⭐ the repo if you believe AI education should be free for everyone.
&lt;/h2&gt;

&lt;p&gt;I'd love your feedback — what topics should we cover next?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>education</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I Built a RAG Bot That Lets You @mention Your Entire Codebase in GitHub Copilot</title>
      <dc:creator>Ramesh Reddy Adutla</dc:creator>
      <pubDate>Wed, 04 Mar 2026 21:02:54 +0000</pubDate>
      <link>https://dev.to/rameshreddy-adutla/i-built-a-rag-bot-that-lets-you-mention-your-entire-codebase-in-github-copilot-298l</link>
      <guid>https://dev.to/rameshreddy-adutla/i-built-a-rag-bot-that-lets-you-mention-your-entire-codebase-in-github-copilot-298l</guid>
      <description>&lt;p&gt;Ever wished you could ask your codebase a question and get an answer that actually cites the source file?&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;GitSage&lt;/strong&gt; — a self-hosted RAG bot that indexes your entire GitHub org and lets you chat with it. The killer feature? It works as a &lt;strong&gt;GitHub Copilot Extension&lt;/strong&gt;, so you can type &lt;code&gt;@gitsage&lt;/code&gt; right inside Copilot Chat.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You:      @gitsage how does authentication work across our services?

GitSage:  Authentication is handled by the auth-service using JWT tokens...
          📁 auth-service/src/main/java/AuthController.java (score: 0.94)
          📁 auth-service/src/main/java/JwtTokenProvider.java (score: 0.89)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;No hallucinations. Just your code, cited.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I work in a large org with 100+ repositories. New joiners take weeks to understand the codebase. Senior engineers repeatedly answer the same "where is X?" and "how does Y work?" questions.&lt;/p&gt;

&lt;p&gt;GitHub Copilot is great for autocomplete, but it doesn't know your &lt;em&gt;organisation's&lt;/em&gt; code. It can't tell you how &lt;em&gt;your team&lt;/em&gt; handles authentication or which service owns the payment flow.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Solution: RAG + Copilot Extension
&lt;/h2&gt;

&lt;p&gt;GitSage does three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Indexes&lt;/strong&gt; — Crawls your GitHub org (READMEs, source code, issues) and stores embeddings in PostgreSQL + pgvector&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieves&lt;/strong&gt; — When you ask a question, finds the most relevant code chunks via similarity search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answers&lt;/strong&gt; — Feeds the retrieved context to an LLM and streams a grounded response&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The magic is that it also implements the &lt;strong&gt;GitHub Copilot Extensions protocol&lt;/strong&gt;, so it plugs directly into the Copilot Chat experience your team already uses.&lt;/p&gt;
&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
    A[Developer] --&amp;gt;|"@gitsage"| B[GitHub Copilot]
    A --&amp;gt;|curl| C[REST API]

    B --&amp;gt;|SSE| D[Copilot Extension]
    C --&amp;gt; E[Chat API]

    D --&amp;gt; F[RAG Engine]
    E --&amp;gt; F

    F --&amp;gt; G[Similarity Search]
    F --&amp;gt; H[LLM]

    I[Indexer] --&amp;gt; J[Chunker]
    J --&amp;gt; K[Embeddings]
    K --&amp;gt; L[(pgvector)]
    G --&amp;gt; L
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;p&gt;I chose this stack deliberately:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Choice&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;&lt;strong&gt;Java 21&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Records, sealed classes, virtual threads — modern Java is &lt;em&gt;nice&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Micronaut 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Faster startup than Spring Boot, compile-time DI, GraalVM-ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LangChain4j&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Java-native RAG framework, no Python dependency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;pgvector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vectors in PostgreSQL — one less service to manage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenAI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GPT-4o for chat, text-embedding-3-small for vectors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  The Copilot Extension Protocol
&lt;/h2&gt;

&lt;p&gt;This was the most interesting part. GitHub Copilot Extensions use an &lt;strong&gt;OpenAI-compatible SSE streaming format&lt;/strong&gt;. Your endpoint receives a list of chat messages and streams back tokens:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Controller&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/copilot"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CopilotExtensionController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Post&lt;/span&gt;
    &lt;span class="nd"&gt;@Produces&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"text/event-stream"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;HttpResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Publisher&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleCopilotRequest&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;HttpRequest&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;httpRequest&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="nd"&gt;@Body&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;rawBody&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;// 1. Verify GitHub's webhook signature&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;httpRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getHeaders&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"X-Hub-Signature-256"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;signatureVerifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rawBody&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;HttpResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UNAUTHORIZED&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// 2. Extract the user's question&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;objectMapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rawBody&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
            &lt;span class="nc"&gt;CopilotRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;userMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extractLastUserMessage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// 3. Stream RAG-augmented response&lt;/span&gt;
        &lt;span class="nc"&gt;Sinks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Many&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sink&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Sinks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;many&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;unicast&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onBackpressureBuffer&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;ragService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;chatStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userMessage&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;sink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tryEmitNext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatSSE&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                &lt;span class="nc"&gt;StreamEvent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt;
        &lt;span class="o"&gt;}).&lt;/span&gt;&lt;span class="na"&gt;whenComplete&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;sink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tryEmitNext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatSSE&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;StreamEvent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="o"&gt;()));&lt;/span&gt;
            &lt;span class="n"&gt;sink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tryEmitNext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"data: [DONE]\n\n"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;sink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tryEmitComplete&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;});&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;HttpResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asFlux&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Each SSE event follows the OpenAI chat completion chunk format:&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="err"&gt;data:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"chatcmpl-gitsage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"chat.completion.chunk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"choices"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"index"&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="nl"&gt;"delta"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"The auth"&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;
  
  
  Smart Chunking
&lt;/h2&gt;

&lt;p&gt;Naive character-based splitting destroys context. GitSage's chunker is &lt;strong&gt;code-aware&lt;/strong&gt; — it splits at natural boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Markdown headers (&lt;code&gt;#&lt;/code&gt;, &lt;code&gt;##&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Class/method declarations (&lt;code&gt;public class&lt;/code&gt;, &lt;code&gt;function&lt;/code&gt;, &lt;code&gt;def&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Blank lines (paragraph breaks)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With configurable overlap so context isn't lost between chunks.&lt;/p&gt;
&lt;h2&gt;
  
  
  One-Command Setup
&lt;/h2&gt;

&lt;p&gt;This was a hard requirement. If people can't try it in 2 minutes, they won't star it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/rameshreddy-adutla/gitsage.git
&lt;span class="nb"&gt;cd &lt;/span&gt;gitsage
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env  &lt;span class="c"&gt;# add your tokens&lt;/span&gt;
docker compose &lt;span class="nt"&gt;-f&lt;/span&gt; docker/docker-compose.yml &lt;span class="nt"&gt;--env-file&lt;/span&gt; .env up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# Index your org&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8080/api/index

&lt;span class="c"&gt;# Ask a question&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8080/api/chat &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="s1"&gt;'{"question": "How does error handling work?"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Docker Compose spins up GitSage + PostgreSQL with pgvector. That's it.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. pgvector is underrated.&lt;/strong&gt; You don't need Pinecone, Weaviate, or Qdrant for most RAG use cases. pgvector with an HNSW index inside PostgreSQL is fast, simple, and one less service to manage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. LangChain4j is mature.&lt;/strong&gt; The Java RAG ecosystem has caught up. Swappable providers, streaming support, batch embedding — it just works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Copilot Extensions are a blue ocean.&lt;/strong&gt; Very few open-source examples exist. If you build one that's actually useful, the GitHub community notices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. README quality is 80% of stars.&lt;/strong&gt; Architecture diagrams (Mermaid renders natively on GitHub), badges, and a clear quick-start section matter more than perfect code.&lt;/p&gt;
&lt;h2&gt;
  
  
  Roadmap
&lt;/h2&gt;

&lt;p&gt;GitSage is just getting started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🦙 &lt;strong&gt;Ollama support&lt;/strong&gt; — run fully local, no API keys needed&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Web UI&lt;/strong&gt; — browser-based chat interface&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Prometheus metrics&lt;/strong&gt; — observability for indexing and queries&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;GraalVM native image&lt;/strong&gt; — instant startup&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Slack/Teams integration&lt;/strong&gt; — chat from team channels&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Try It
&lt;/h2&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/rameshreddy-adutla" rel="noopener noreferrer"&gt;
        rameshreddy-adutla
      &lt;/a&gt; / &lt;a href="https://github.com/rameshreddy-adutla/gitsage" rel="noopener noreferrer"&gt;
        gitsage
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🧙 A sage that knows your codebase — RAG-powered GitHub org knowledge bot with Copilot Extension support
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🧙‍♂️ GitSage&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;em&gt;A sage that knows your codebase&lt;/em&gt;&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Index your entire GitHub org → Ask questions about your code → Get AI-powered answers with source citations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/open-ai-school/gitsage/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/open-ai-school/gitsage/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://openjdk.org/projects/jdk/21/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/81df43f53972868aeaf04299bf83789315e3706cace797fd06bfece7beda366e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4a6176612d32312d6f72616e67652e737667" alt="Java 21"&gt;&lt;/a&gt;
&lt;a href="https://micronaut.io/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e372df03753350ab3bf2bcaac21f75f23017222e807074efef1a58f645f2c2f7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d6963726f6e6175742d342e372d626c75652e737667" alt="Micronaut 4"&gt;&lt;/a&gt;
&lt;a href="https://docs.github.com/en/copilot/building-copilot-extensions" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/982532dde0aabc56ec7a79edc7da85525db601ab2b38b6be65383a343a39f96d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f70696c6f742d457874656e73696f6e2d3666343263312e737667" alt="GitHub Copilot Extension"&gt;&lt;/a&gt;
&lt;a href="https://www.docker.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/81522ff7e7e4c44c6913c29595a799bc3a15531b345e66b947b0c5192bafca0c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f636b65722d52656164792d3234393645442e737667" alt="Docker"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://github.com/rameshreddy-adutla/gitsage#-quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt; •
&lt;a href="https://github.com/rameshreddy-adutla/gitsage#-features" rel="noopener noreferrer"&gt;Features&lt;/a&gt; •
&lt;a href="https://github.com/rameshreddy-adutla/gitsage#-architecture" rel="noopener noreferrer"&gt;Architecture&lt;/a&gt; •
&lt;a href="https://github.com/rameshreddy-adutla/gitsage#-copilot-extension" rel="noopener noreferrer"&gt;Copilot Extension&lt;/a&gt; •
&lt;a href="https://github.com/rameshreddy-adutla/gitsage#%EF%B8%8F-configuration" rel="noopener noreferrer"&gt;Configuration&lt;/a&gt; •
&lt;a href="https://github.com/rameshreddy-adutla/gitsage#-contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💡 What is GitSage?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;GitSage is a &lt;strong&gt;self-hosted RAG (Retrieval-Augmented Generation) bot&lt;/strong&gt; that indexes your GitHub organisation's repositories and lets you chat with your codebase. It understands your code, READMEs, issues, and development patterns — and cites its sources.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Works as a GitHub Copilot Extension&lt;/strong&gt; — type &lt;code&gt;@gitsage&lt;/code&gt; in Copilot Chat and ask anything about your org's code.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;You:      @gitsage how does authentication work in our services?

GitSage:  Based on the codebase, authentication is handled by the `auth-service` 
          repository using JWT tokens...
          
          📁 auth-service/src/main/java/com/example/AuthController.java
          📁 auth-service/src/main/java/com/example/JwtTokenProvider.java
          
          The flow is: Login → Validate credentials → Issue JWT → Store in 
          HTTP-only cookie → Verify on subsequent requests via JwtAuthFilter...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Features&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;/tr&gt;
&lt;/thead&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/rameshreddy-adutla/gitsage" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repo has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full source code (Java 21, Micronaut 4)&lt;/li&gt;
&lt;li&gt;Docker Compose one-command setup&lt;/li&gt;
&lt;li&gt;Detailed architecture docs with Mermaid diagrams&lt;/li&gt;
&lt;li&gt;Copilot Extension setup guide&lt;/li&gt;
&lt;li&gt;Contributing guide for newcomers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this solves a problem for your team, give it a ⭐ — it helps others discover it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What questions do you have about building RAG systems or Copilot Extensions? Drop a comment below — happy to go deeper on any part of this.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>ai</category>
      <category>github</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
