<?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: Mohamed Ghareeb</title>
    <description>The latest articles on DEV Community by Mohamed Ghareeb (@mohamed_ghareeb_d1dab4200).</description>
    <link>https://dev.to/mohamed_ghareeb_d1dab4200</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%2F3804084%2F14cd8348-ee76-42e7-beb8-f2d6ce97512d.png</url>
      <title>DEV Community: Mohamed Ghareeb</title>
      <link>https://dev.to/mohamed_ghareeb_d1dab4200</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohamed_ghareeb_d1dab4200"/>
    <language>en</language>
    <item>
      <title>I Built a Pitch Deck Generator in One Conversation — No Code Required</title>
      <dc:creator>Mohamed Ghareeb</dc:creator>
      <pubDate>Tue, 14 Apr 2026 17:19:18 +0000</pubDate>
      <link>https://dev.to/mohamed_ghareeb_d1dab4200/i-built-a-pitch-deck-generator-in-one-conversation-no-code-required-3l3d</link>
      <guid>https://dev.to/mohamed_ghareeb_d1dab4200/i-built-a-pitch-deck-generator-in-one-conversation-no-code-required-3l3d</guid>
      <description>&lt;p&gt;Every founder has been there.&lt;/p&gt;

&lt;p&gt;You have a great idea. You know it can work. But when it's time &lt;br&gt;
to sit down and build the investor pitch deck — the blank slide &lt;br&gt;
stares back at you for hours.&lt;/p&gt;

&lt;p&gt;What's the TAM? How do I frame the competitive landscape? &lt;br&gt;
What should my ask actually be?&lt;/p&gt;

&lt;p&gt;I've built multiple startups across Egypt and the MENA region. &lt;br&gt;
I've made dozens of pitch decks. And it never gets faster.&lt;/p&gt;

&lt;p&gt;So for the Build with MeDo Hackathon, I decided to solve &lt;br&gt;
this problem once and for all.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Idea: PitchDeck AI
&lt;/h2&gt;

&lt;p&gt;The concept is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Describe your startup in plain text. Get a complete &lt;br&gt;
10-slide investor-ready pitch deck in seconds.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not a template. Not a fill-in-the-blanks form. A fully &lt;br&gt;
generated, narrative-driven pitch deck with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slide titles and structured bullet points&lt;/li&gt;
&lt;li&gt;Speaker notes for every single slide&lt;/li&gt;
&lt;li&gt;Real market data tailored to your idea and geography&lt;/li&gt;
&lt;li&gt;A competitive positioning narrative&lt;/li&gt;
&lt;li&gt;Financial projections framework&lt;/li&gt;
&lt;li&gt;A clear funding ask with use of funds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All from one sentence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building It With MeDo — Zero Code
&lt;/h2&gt;

&lt;p&gt;Here's what surprised me most about this project.&lt;/p&gt;

&lt;p&gt;I built the entire application through conversation.&lt;/p&gt;

&lt;p&gt;I opened MeDo, described what I wanted, and it generated &lt;br&gt;
the full-stack app — frontend, AI integration, PDF export, &lt;br&gt;
theme switching, shareable links. Everything.&lt;/p&gt;

&lt;p&gt;When a bug appeared (a callbacks error in the AI integration), &lt;br&gt;
I described the error in plain English and MeDo fixed it in &lt;br&gt;
one iteration.&lt;/p&gt;

&lt;p&gt;This is what building software should feel like.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Output That Amazed Me
&lt;/h2&gt;

&lt;p&gt;I tested PitchDeck AI with this input:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"AI tutor for Egyptian K-12 students"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here's what it generated for the Market Size slide:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Total Addressable Market for tutoring in the MENA &lt;br&gt;
region is valued at over $5 billion annually. Egypt hosts &lt;br&gt;
25 million K-12 students, representing the largest and &lt;br&gt;
most concentrated educational market in the region. Our &lt;br&gt;
initial target is the 500,000 tech-savvy households in &lt;br&gt;
urban centers currently spending heavily on private tutors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is better than slides I have spent hours researching &lt;br&gt;
and writing manually.&lt;/p&gt;




&lt;h2&gt;
  
  
  What PitchDeck AI Can Do
&lt;/h2&gt;

&lt;p&gt;✅ Generate 10 investor-ready slides from one sentence&lt;br&gt;&lt;br&gt;
✅ Speaker notes on every slide&lt;br&gt;&lt;br&gt;
✅ Refine any slide via chat ("make slide 4 more aggressive")&lt;br&gt;&lt;br&gt;
✅ Switch between Dark, Light, and Bold themes&lt;br&gt;&lt;br&gt;
✅ Export full deck as PDF&lt;br&gt;&lt;br&gt;
✅ Share a public link directly with investors  &lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;The app is live and free to use:&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://app-aykhztdlnke9.appmedo.com" rel="noopener noreferrer"&gt;https://app-aykhztdlnke9.appmedo.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Describe your startup idea and see what it generates. &lt;br&gt;
I'd love to hear what you think.&lt;/p&gt;




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

&lt;p&gt;MeDo changed how I think about building products.&lt;/p&gt;

&lt;p&gt;The fastest path from idea to deployed application is not &lt;br&gt;
writing code — it's having a clear conversation about what &lt;br&gt;
you want to build and iterating until it's right.&lt;/p&gt;

&lt;p&gt;As someone who has built products with large engineering &lt;br&gt;
teams, I can say this honestly: MeDo compressed what would &lt;br&gt;
normally take a week of development into a single afternoon.&lt;/p&gt;

&lt;p&gt;That is not a small thing. That is the future of building.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built for the Build with MeDo Hackathon 2026.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Try PitchDeck AI → &lt;a href="https://app-aykhztdlnke9.appmedo.com" rel="noopener noreferrer"&gt;https://app-aykhztdlnke9.appmedo.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  BuiltWithMeDo #MeDoHackathon #AI #NoCode #Startup #PitchDeck
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>startup</category>
    </item>
    <item>
      <title>I Built a Live AI Math Tutor You Can Interrupt Mid-Sentence</title>
      <dc:creator>Mohamed Ghareeb</dc:creator>
      <pubDate>Tue, 03 Mar 2026 14:26:59 +0000</pubDate>
      <link>https://dev.to/mohamed_ghareeb_d1dab4200/i-built-a-live-ai-math-tutor-you-can-interrupt-mid-sentence-290d</link>
      <guid>https://dev.to/mohamed_ghareeb_d1dab4200/i-built-a-live-ai-math-tutor-you-can-interrupt-mid-sentence-290d</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Live AI Math Tutor You Can Interrupt Mid-Sentence
&lt;/h1&gt;

&lt;p&gt;How Gemini's Live API made real-time, voice-first tutoring possible — and what I learned building WebRTC audio transport on top of it.&lt;/p&gt;

&lt;h1&gt;
  
  
  GeminiLiveAgentChallenge
&lt;/h1&gt;

&lt;p&gt;The 10-Second Pitch&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SolveWave&lt;/strong&gt; is a live AI math tutor where students speak a problem, get an instant audio explanation, and can interrupt mid-sentence to ask "wait, what?" — just like with a real tutor. It also reads handwritten homework from photos and adapts its teaching style on the fly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;See it. Say it. Solve it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Try it live: &lt;a href="https://solvewave-frontend-872506223416.us-central1.run.app" rel="noopener noreferrer"&gt;https://solvewave-frontend-872506223416.us-central1.run.app&lt;/a&gt;&lt;br&gt;
Code: &lt;a href="https://github.com/Appenza-Main-Org/solvewave-live" rel="noopener noreferrer"&gt;https://github.com/Appenza-Main-Org/solvewave-live&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Every AI tutoring tool I've seen works the same way: type a question, click send, wait, read a wall of text, repeat. That's not tutoring — that's a search engine with extra steps.&lt;/p&gt;

&lt;p&gt;Real tutoring is messy. A student says "I don't get fractions," the tutor starts explaining, the student interrupts with "wait, why did you flip it?" — and the tutor pivots instantly. There's no "submit" button in a real conversation.&lt;/p&gt;

&lt;p&gt;When I saw that Google's Gemini Live API supported full-duplex audio with native barge-in detection, I knew I could build something that actually felt like a conversation.&lt;/p&gt;

&lt;p&gt;What SolveWave Does&lt;/p&gt;

&lt;p&gt;Three ways to ask:&lt;/p&gt;

&lt;p&gt;Speak a problem — "How do I solve 2x + 5 = 17?" — and hear a step-by-step explanation instantly.&lt;/p&gt;

&lt;p&gt;Upload a photo of handwritten homework — SolveWave reads it and walks you through the solution.&lt;/p&gt;

&lt;p&gt;Type if you prefer — same tutor, same quality.&lt;/p&gt;

&lt;p&gt;Three tutoring modes:&lt;/p&gt;

&lt;p&gt;Explain — walks through solutions step by step.&lt;/p&gt;

&lt;p&gt;Quiz — flips the script and asks you questions to test understanding.&lt;/p&gt;

&lt;p&gt;Homework — works through full problem sets, showing every step.&lt;/p&gt;

&lt;p&gt;The key feature is barge-in. You can interrupt SolveWave mid-explanation. It stops immediately, listens to your follow-up, and responds — no button press, no waiting. This is what makes it feel like a real tutor instead of a voice assistant.&lt;/p&gt;

&lt;p&gt;How It Works: WebRTC Audio + WebSocket Control&lt;/p&gt;

&lt;p&gt;The architecture uses two communication channels working together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser  &amp;lt;--WebRTC (Opus audio)---&amp;gt;  FastAPI Backend  &amp;lt;--Live API--&amp;gt;  Gemini
Browser  &amp;lt;--WebSocket (control)----&amp;gt;  FastAPI Backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;WebRTC&lt;/strong&gt; handles real-time audio transport (primary path). The browser captures audio with echo cancellation, noise suppression, and auto gain control enabled at the hardware level. Audio is Opus-encoded and sent over DTLS/SRTP — lower latency than TCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebSocket&lt;/strong&gt; handles everything else — text messages, image uploads, signaling, status updates, and session control. It also serves as the fallback audio path (raw PCM binary frames) when WebRTC can't establish a connection (e.g., on Cloud Run without a TURN server).&lt;/p&gt;

&lt;p&gt;The Backend&lt;/p&gt;

&lt;p&gt;FastAPI with two concurrent asyncio tasks:&lt;/p&gt;

&lt;p&gt;Upstream: audio (from WebRTC or WS fallback) flows through an asyncio.Queue to Gemini Live.&lt;/p&gt;

&lt;p&gt;Downstream: Gemini's audio response streams back — either through WebRTC (Opus-encoded via a custom GeminiOutputTrack) or WebSocket binary frames.&lt;/p&gt;

&lt;p&gt;The asyncio.Queue was a critical design choice. Both WebRTC and WebSocket audio sources feed the same queue, which decouples the receive path from the Gemini send loop. This prevents audio backpressure from blocking either connection and makes the fallback seamless.&lt;/p&gt;

&lt;p&gt;Text and image requests use Gemini's standard generate API (gemini-2.5-flash) rather than the Live API, since they don't need streaming audio.&lt;/p&gt;

&lt;p&gt;The Frontend&lt;/p&gt;

&lt;p&gt;Next.js 14 with four key hooks:&lt;/p&gt;

&lt;p&gt;useSessionSocket — WebSocket control channel, live state management, text/image messaging, WebRTC negotiation.&lt;/p&gt;

&lt;p&gt;useWebRTC — RTCPeerConnection lifecycle, getUserMedia with AEC/NS/AGC, SDP offer/answer exchange, mic mute/unmute, remote audio auto-playback.&lt;/p&gt;

&lt;p&gt;useVoiceTranscription — Web Speech API for live transcription (partial results update word-by-word, echo suppression while tutor speaks).&lt;/p&gt;

&lt;p&gt;useSessionTimer — Session duration tracking in mm:ss format.&lt;/p&gt;

&lt;p&gt;The UI tracks eight distinct live states (Idle, Connecting, Live, Listening, Thinking, Speaking, Seeing, Interrupted) — each with its own visual indicator so students always know what the tutor is doing.&lt;/p&gt;

&lt;p&gt;The Hard Parts&lt;/p&gt;

&lt;p&gt;WebRTC on Cloud Run&lt;/p&gt;

&lt;p&gt;Cloud Run doesn't support raw UDP traffic, which WebRTC media requires. I solved this with a graceful fallback architecture:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browser sends an SDP offer via the existing WebSocket&lt;/li&gt;
&lt;li&gt;Backend (using aiortc) creates a peer connection and responds with an SDP answer&lt;/li&gt;
&lt;li&gt;If ICE succeeds (local dev, or with a TURN server) — WebRTC audio flows&lt;/li&gt;
&lt;li&gt;If ICE fails — the system automatically falls back to WebSocket binary audio&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The browser still benefits from getUserMedia's AEC/NS/AGC constraints even in fallback mode. The student never knows which transport is active.&lt;/p&gt;

&lt;p&gt;Barge-in UX&lt;/p&gt;

&lt;p&gt;Gemini's Live API detects interruptions automatically — but surfacing that in the UI required care. When the backend receives an interruption signal, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stops sending audio to the browser&lt;/li&gt;
&lt;li&gt;Discards any partial response text&lt;/li&gt;
&lt;li&gt;Sends an "interrupted" control message to the frontend&lt;/li&gt;
&lt;li&gt;The UI flashes an orange "Interrupted" indicator for 900ms&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result: the student talks over SolveWave, it stops within a fraction of a second, and the UI confirms it happened. It feels natural.&lt;/p&gt;

&lt;p&gt;Web Speech API Auto-Restart&lt;/p&gt;

&lt;p&gt;Chrome's Web Speech API has a quirk: even with continuous mode enabled, it sometimes stops recognition after a final result. If you don't handle this, the student asks one question by voice and then transcription silently dies.&lt;/p&gt;

&lt;p&gt;The fix: a wantRunningRef flag that tracks whether the user wants transcription active. When the recognition's onend fires unexpectedly, we check the flag and auto-restart a new instance — reusing the same event handlers. The user never notices.&lt;/p&gt;

&lt;p&gt;Dual Audio + Text Response Path&lt;/p&gt;

&lt;p&gt;When a student speaks, two things happen simultaneously:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Audio goes to Gemini Live API (via WebRTC/WS) for a voice response&lt;/li&gt;
&lt;li&gt;Web Speech API transcribes locally, and the final transcript is sent to the standard text API for a guaranteed text response&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This dual path means the student always gets both a spoken answer and a written transcript — even if one path hiccups.&lt;/p&gt;

&lt;p&gt;Deployment: Cloud Run&lt;/p&gt;

&lt;p&gt;Both frontend and backend deploy to Google Cloud Run with a single command each:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud run deploy solvewave-backend &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--source&lt;/span&gt; backend &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; us-central1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--allow-unauthenticated&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cloud Run handles container builds, TLS termination (so WebSockets upgrade to wss:// automatically), and scales to zero when idle. I wrote deployment scripts for one-command deploys on any platform.&lt;/p&gt;

&lt;p&gt;For judges and reviewers who don't have a Gemini API key, there's a stub mode (GEMINI_STUB=true) that returns canned responses — so you can test the full UX pipeline without any credentials.&lt;/p&gt;

&lt;p&gt;The Stack&lt;/p&gt;

&lt;p&gt;AI Model: Gemini 2.5 Flash — native audio (gemini-2.5-flash-native-audio-latest) + text/vision (gemini-2.5-flash)&lt;/p&gt;

&lt;p&gt;SDK: Google GenAI SDK (google-genai Python package)&lt;/p&gt;

&lt;p&gt;Backend: FastAPI + asyncio + aiortc (WebRTC) + WebSockets&lt;/p&gt;

&lt;p&gt;Frontend: Next.js 14 (App Router) + Tailwind CSS + TypeScript + Framer Motion&lt;/p&gt;

&lt;p&gt;Audio Transport: WebRTC (Opus, DTLS/SRTP) with WebSocket PCM fallback&lt;/p&gt;

&lt;p&gt;Transcription: Web Speech API (browser-native, real-time)&lt;/p&gt;

&lt;p&gt;Math Rendering: KaTeX (LaTeX in chat bubbles)&lt;/p&gt;

&lt;p&gt;Cloud: Google Cloud Run (us-central1)&lt;/p&gt;

&lt;p&gt;Tools: 4 structured tools — problem type detection, answer checking, hint generation, session recap&lt;/p&gt;

&lt;p&gt;What I'd Build Next&lt;/p&gt;

&lt;p&gt;Session persistence — save transcripts and recaps to Firestore so students can review past sessions.&lt;/p&gt;

&lt;p&gt;Progress tracking — track which topics a student struggles with across sessions.&lt;/p&gt;

&lt;p&gt;Multi-subject expansion — the architecture generalizes beyond math (science, language arts).&lt;/p&gt;

&lt;p&gt;TURN server on GCE — full WebRTC audio on Cloud Run without fallback.&lt;/p&gt;

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

&lt;p&gt;Live app: &lt;a href="https://solvewave-frontend-872506223416.us-central1.run.app" rel="noopener noreferrer"&gt;https://solvewave-frontend-872506223416.us-central1.run.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run locally (no API key needed):&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;# Backend with stub mode&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="nv"&gt;GEMINI_STUB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true &lt;/span&gt;uvicorn app.main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;

&lt;span class="c"&gt;# Frontend&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;frontend &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full source: &lt;a href="https://github.com/Appenza-Main-Org/solvewave-live" rel="noopener noreferrer"&gt;https://github.com/Appenza-Main-Org/solvewave-live&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built for the Google Gemini Live Agent Challenge.&lt;/p&gt;

&lt;p&gt;#GeminiLiveAgentChallenge #GoogleGemini #LiveAgents #AI #EdTech #MathTutor #CloudRun #GeminiLiveAPI #WebRTC&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gemini</category>
      <category>learning</category>
      <category>geminiliveagentchallenge</category>
    </item>
  </channel>
</rss>
