<?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: Vridhi Sachdev</title>
    <description>The latest articles on DEV Community by Vridhi Sachdev (@wickedseer).</description>
    <link>https://dev.to/wickedseer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4159890%2Fc9f55387-c414-41a4-89dd-bb22b64e34d2.png</url>
      <title>DEV Community: Vridhi Sachdev</title>
      <link>https://dev.to/wickedseer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wickedseer"/>
    <language>en</language>
    <item>
      <title>Deutsch mit Gemma! (German with Gemma!)</title>
      <dc:creator>Vridhi Sachdev</dc:creator>
      <pubDate>Sun, 04 Oct 2026 11:24:39 +0000</pubDate>
      <link>https://dev.to/wickedseer/deutsch-mit-gemma-german-with-gemma-2h20</link>
      <guid>https://dev.to/wickedseer/deutsch-mit-gemma-german-with-gemma-2h20</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Der, die or das Nutella? I built a German tutor so my friend can finally stop second-guessing
&lt;/h2&gt;

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

&lt;p&gt;I wear many hats, and one of them is of a &lt;strong&gt;German trainer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After a while you notice the same thing in almost every learner: they &lt;em&gt;understand&lt;/em&gt; far more German than they can &lt;em&gt;use&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;They know the word. They've seen it a dozen times. And then they open their mouth and...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Wait. Is it &lt;strong&gt;der&lt;/strong&gt;  , &lt;strong&gt;die&lt;/strong&gt; or &lt;strong&gt;das&lt;/strong&gt;?" 🤔&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Take the most important word in German life: &lt;strong&gt;Nutella&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Die&lt;/strong&gt; Nutella? &lt;strong&gt;Das&lt;/strong&gt; Nutella? Or, depending on who you ask... &lt;strong&gt;der&lt;/strong&gt; Nutella? 😅&lt;/p&gt;

&lt;p&gt;(Even native speakers argue about this one.)&lt;/p&gt;

&lt;p&gt;My student, who is also a friend, has exactly this problem. She wants to &lt;strong&gt;speak&lt;/strong&gt;, and every noun is a tiny roadblock. So I built &lt;strong&gt;Deutsch mit Gemma!&lt;/strong&gt;, a speaking partner whose whole philosophy is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Move German from your passive vocabulary into active vocabulary,&lt;/strong&gt; so the right word comes out without a pause.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&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;Speaking practice&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Four real-life scenarios (restaurant, bakery, shopping, doctor) plus a free chat. The model plays the character, like the baker or the doctor, and talks to the student&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎙️ &lt;strong&gt;Talk, don't type&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;She speaks into the mic, the tutor answers out loud in A1-A2 German, and she can play back her own recording&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✏️ &lt;strong&gt;Corrections that teach&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;After every turn: what she said, the fix, the &lt;strong&gt;sentence formula&lt;/strong&gt;, and a short English reason&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🃏 &lt;strong&gt;Flashcards&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Every noun from the conversation becomes a der/die/das card: &lt;code&gt;___ Brot&lt;/code&gt; → pick the article&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📝 &lt;strong&gt;Session summary&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Say &lt;em&gt;Tschüss&lt;/em&gt; and the chat ends with a summary of mistakes, better versions, alternative sentences and tips&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🗂️ &lt;strong&gt;Sessions&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Each conversation is its own record, so last week's words never leak into today's&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Speak → make a mistake → see the formula → drill the nouns → speak again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Not another vocabulary app. Not another worksheet. A place to use German, get it wrong, understand why, and try again.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://deutsch-mit-gemma.streamlit.app/" rel="noopener noreferrer"&gt;https://deutsch-mit-gemma.streamlit.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⏱️ &lt;strong&gt;Heads-up:&lt;/strong&gt; replies take a few seconds. Every turn, Gemma works out the answer &lt;em&gt;and&lt;/em&gt; a voice is generated, so treat it like a baker who's busy and wants to answer properly. If the app has been idle, it may also need a moment to wake up on first load.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&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/wickedseer" rel="noopener noreferrer"&gt;
        wickedseer
      &lt;/a&gt; / &lt;a href="https://github.com/wickedseer/deutsch-mit-gemma" rel="noopener noreferrer"&gt;
        deutsch-mit-gemma
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A German speaking partner for A1-A2 learners, built on the open-weight Gemma model.
    &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;Deutsch mit Gemma!&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A German speaking partner for A1-A2 learners, built on the open-weight &lt;strong&gt;Gemma&lt;/strong&gt; model.&lt;/p&gt;

&lt;p&gt;The app starts a short role-play, listens to the student speak, and corrects their German with the exact sentence pattern they got wrong.&lt;/p&gt;

&lt;p&gt;Built for the DEV Hacktoberfest "Build for a Friend" challenge, for one real student who wants speaking practice and keeps forgetting sentence structure and der/die/das.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Feature&lt;/th&gt;

&lt;th&gt;Details&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;Spoken role-play&lt;/td&gt;

&lt;td&gt;Bakery, doctor, Anmeldung, restaurant, or free chat. Replies are short, in A1-A2 German, and end with an easy question&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Voice in and out&lt;/td&gt;

&lt;td&gt;Tutor replies are read aloud (ElevenLabs TTS). The student speaks through the mic button in the chat box (ElevenLabs speech-to-text). Students' own recording is playable in the chat&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Corrections with the formula&lt;/td&gt;

&lt;td&gt;Every correction shows what she said, the better sentence, the &lt;strong&gt;sentence pattern&lt;/strong&gt;, and the rule&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Flashcards&lt;/td&gt;

&lt;td&gt;A separate tab turns every noun used&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;…&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/wickedseer/deutsch-mit-gemma" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Gemma 4 26B A4B (&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;) via the Gemini API · ElevenLabs (speech-to-text and text-to-speech) · Streamlit · Python&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trick is a contract, not a chat.&lt;/strong&gt; Every turn, Gemma answers in JSON, and that one structure drives the spoken reply, the correction, the flashcards and the goodbye detection:&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;"reply_de"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ja, gern. Was möchten Sie trinken?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"correction"&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;"said"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kann hier sitzen ich?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"better"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Kann ich hier sitzen?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ja/Nein-Frage mit Modalverb: Modalverb + Subjekt + Ort + Infinitiv (Ende) ?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rule_en"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Yes/no questions start with the verb. The second verb goes to the end."&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;"nouns"&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="nl"&gt;"article"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"der"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"word"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tisch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"table"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt design&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Four worked examples (modal question, &lt;code&gt;weil&lt;/code&gt;, Perfekt, wrong article)&lt;/td&gt;
&lt;td&gt;Gemma gives the sentence &lt;em&gt;formula&lt;/em&gt;, not just the fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One correction per turn&lt;/td&gt;
&lt;td&gt;A beginner isn't buried&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A role and context per scenario ("you are the baker")&lt;/td&gt;
&lt;td&gt;The tutor acts the character instead of narrating the scene&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;A language app holds something personal: how someone speaks and the mistakes they keep making. With an open-weight model, I'm not locked into one provider's black box.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Open Gemma gives me&lt;/th&gt;
&lt;th&gt;Why it matters here&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control over behavior&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The tutor's level, tone, role-play and correction format live in one prompt a teacher can edit and test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Choice of model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Switching models is one setting, with no change to the app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Downloadable weights&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemma 4 is released under Apache 2.0, so a school can serve it on its own servers and keep students' recordings and mistakes in-house&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Low cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A teacher can build and run this for one student without a budget&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma is the brain: character-driven role-play, JSON-structured corrections with sentence formulas, noun extraction for flashcards, goodbye detection and the session summary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs:&lt;/strong&gt; I used ElevenLabs text-to-speech (&lt;code&gt;eleven_multilingual_v2&lt;/code&gt;) to voice the tutor and speech-to-text (&lt;code&gt;scribe_v1&lt;/code&gt;) to transcribe the student's spoken German, which simulates a real speaking-practice conversation, with her own recording played back in the chat.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
