<?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: Dariusz Dumnicki</title>
    <description>The latest articles on DEV Community by Dariusz Dumnicki (@dumnicki).</description>
    <link>https://dev.to/dumnicki</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%2F4155891%2F97f9ef02-2eec-41cc-9013-453cc16dc301.jpg</url>
      <title>DEV Community: Dariusz Dumnicki</title>
      <link>https://dev.to/dumnicki</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dumnicki"/>
    <language>en</language>
    <item>
      <title>poligem: a Polish conversation tutor that runs entirely on your own laptop</title>
      <dc:creator>Dariusz Dumnicki</dc:creator>
      <pubDate>Sun, 04 Oct 2026 22:20:56 +0000</pubDate>
      <link>https://dev.to/dumnicki/poligem-a-polish-conversation-tutor-that-runs-entirely-on-your-own-laptop-24j6</link>
      <guid>https://dev.to/dumnicki/poligem-a-polish-conversation-tutor-that-runs-entirely-on-your-own-laptop-24j6</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;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;poligem&lt;/strong&gt; is a Polish conversation practice app that runs entirely on your own laptop. The conversation core is &lt;a href="https://ai.google.dev/gemma" rel="noopener noreferrer"&gt;Gemma 3 (4B)&lt;/a&gt;, an open-weight model served locally through &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;. No account, no API key, no subscription — and no data leaving the computer.&lt;br&gt;
I've built it for my girlfriend who has recently started learning Polish. Since the app uses a locally served, open-weight model, she can practice even on the airplane when there's no wifi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Poligem&lt;/strong&gt; app has three parts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chat that starts with a situation.&lt;/strong&gt; Most language apps open with "what would you like to talk about?", which is a hard question when you're a beginner — you don't have the vocabulary to answer it yet. poligem's tutor picks a scene and puts you inside it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ćwiczmy. Wyobraź sobie, że jesteś w kawiarni, a kelner podchodzi i mówi: &lt;em&gt;„Dzień dobry, co podać?"&lt;/em&gt; — co odpowiesz?&lt;br&gt;
&lt;em&gt;example cafe scenario&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It stays in character and asks one natural follow-up at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When you don't understand.&lt;/strong&gt; A beginner hits an unfamiliar word and stalls. poligem gives you an &lt;strong&gt;EN&lt;/strong&gt; button under any sentence for an English translation. This is the feature that my girlfriend finds particularly useful. Since the translation is hidden at first, it makes her read the polish sentence first before reading the translation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exercises that adapt to you.&lt;/strong&gt; Three drill types — translate English→Polish, translate Polish→English, and fill-the-gap — with a level (A1/A2/B1) derived from your measured accuracy rather than a dropdown you set once and forget. Missed prompts feed back into generation, so exercises target your weak spots instead of repeating one difficulty.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/exLw2qBxHJg" width="710" height="399"&gt;
  &lt;/iframe&gt;
&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/dumnicki" rel="noopener noreferrer"&gt;
        dumnicki
      &lt;/a&gt; / &lt;a href="https://github.com/dumnicki/poligem" rel="noopener noreferrer"&gt;
        poligem
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Poligem - an app for Polish language practice
    &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;poligem&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A Polish conversation practice app that runs entirely on your own machine.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;poligem&lt;/code&gt; pairs a free chat tutor with structured drills for Polish learners
The conversation core is &lt;strong&gt;Gemma 3 (4B) running locally through Ollama&lt;/strong&gt; — no
accounts, no API keys, no data leaving your laptop.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why it runs locally&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Polish learners are often self-studying, which means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The conversation is private.&lt;/strong&gt; Every sentence you type — including mistakes
and often your name, your work, your partner — stays on your machine. Nothing
is sent to a third party.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is free.&lt;/strong&gt; Ollama and Gemma 3 carry no per-token cost, so the app is not
gated behind a subscription and does not degrade after a trial period.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The tutor is a file, not a service.&lt;/strong&gt; The entire teaching personality —
level handling, scenario framing, correction style, translation behaviour —
lives in &lt;a href="https://github.com/dumnicki/poligem/server/prompt.ts" rel="noopener noreferrer"&gt;&lt;code&gt;server/prompt.ts&lt;/code&gt;&lt;/a&gt;. Changing how &lt;code&gt;poligem&lt;/code&gt; teaches
Polish is editing…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/dumnicki/poligem" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;Gemma 3 (4B) is not one component among several — it &lt;em&gt;is&lt;/em&gt; the application. It writes every line the tutor says, generates every exercise, and drives its own difficulty adjustment based on how you perform. Nothing in the app is a canned response from a lookup table.&lt;/p&gt;

&lt;p&gt;It's served locally via Ollama and reached through an Express proxy. The proxy looks redundant since Ollama's CORS is permissive, but it earns its place: the client never depends on Ollama's API contract, so the model can be swapped without touching the frontend, and it gives one place to inject the tutor's system prompt.&lt;/p&gt;

&lt;p&gt;Two decisions came directly from watching a 4B model fail:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exercises are pre-generated into a pool.&lt;/strong&gt; Generating them takes ~35 seconds on CPU, which is unacceptable mid-lesson. So the server keeps three of each type ready in memory and refills in the background. Handing you an exercise is an array shift, not a model call: &lt;strong&gt;45–167 ms&lt;/strong&gt; measured. If Ollama is down, curated exercises are served instead, rotating so nothing repeats — the app never dead-ends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloze blanks are applied by the server.&lt;/strong&gt; Asked to remove a word from a Polish sentence, Gemma reliably returns a complete sentence and sometimes inserts its own blank — producing sentences with two gaps and an answer that matched neither. Rather than trust the prompt, the server locates the answer word and blanks it deterministically. Refills also generate in batches of three, because asking for a single exercise measurably degraded output into fragments.&lt;/p&gt;

&lt;p&gt;Everything goes through a single request queue: a 4B model on CPU doesn't run two requests in parallel, they interleave and both slow down, and a background refill would otherwise stall your conversation.&lt;/p&gt;

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

&lt;p&gt;Running a small open-weight model &lt;strong&gt;locally&lt;/strong&gt; rather than calling a closed API is what made this app honest to its own premise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The data stays on the machine.&lt;/strong&gt; Every sentence typed — including the mistakes, which are the most revealing thing you produce — never leaves the laptop. A closed API can't offer that at any price.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's free, permanently.&lt;/strong&gt; No token bill, no trial expiring mid-course, no feature degrading once credits run out. For a practice tool you use daily, that changes who can use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline.&lt;/strong&gt; Once the model is pulled, practice works on a plane or on a machine that has never seen a wifi network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The tutor is a file.&lt;/strong&gt; The entire teaching personality — level handling, scenario framing, correction style, translation behaviour — lives in &lt;code&gt;server/prompt.ts&lt;/code&gt;. Changing how poligem teaches Polish is editing one file and restarting. There's no prompt-injection surface from a shared endpoint, and no vendor silently changing the model underneath you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's tunable by the learner.&lt;/strong&gt; Swap the model, adjust the level, add your own vocabulary. A closed API gives you none of that.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything interesting in this project is a &lt;em&gt;consequence&lt;/em&gt; of the small open model rather than a feature bolted onto a commercial one.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; (featured) — Gemma 3 generates the tutor's dialogue, creates every exercise, and adapts its own difficulty. It is the core of the product, not an add-on.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with &lt;a href="https://ai.google.dev/gemma" rel="noopener noreferrer"&gt;Gemma 3&lt;/a&gt; by Google, served locally via &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;. Drafted with AI assistance and verified by hand.&lt;/em&gt;&lt;/p&gt;

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