<?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: Karan Raj</title>
    <description>The latest articles on DEV Community by Karan Raj (@karan244).</description>
    <link>https://dev.to/karan244</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%2F4159364%2F0005527a-9fe3-433b-ab20-a6989dcfb4a7.png</url>
      <title>DEV Community: Karan Raj</title>
      <link>https://dev.to/karan244</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/karan244"/>
    <language>en</language>
    <item>
      <title>I built my mother a planting calendar that tells her what to sow this week</title>
      <dc:creator>Karan Raj</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:21:26 +0000</pubDate>
      <link>https://dev.to/karan244/i-built-my-mother-a-planting-calendar-that-tells-her-what-to-sow-this-week-8ll</link>
      <guid>https://dev.to/karan244/i-built-my-mother-a-planting-calendar-that-tells-her-what-to-sow-this-week-8ll</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Week 1 Challenge: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;Sprout&lt;/strong&gt;, a planting calendar that tells you what you can put in the ground this week, then gets out of the way.&lt;/p&gt;

&lt;p&gt;My mother has a terrace she plants on every October. She does not need an app that tells her to "prepare for the season." She needs three lines and then her hands in the soil. Every planting website I looked at wanted an account, or a dropdown for her exact city, and then showed me an advert for seed companies.&lt;/p&gt;

&lt;p&gt;The question itself is simpler than all that. Almost every cool-season vegetable is timed &lt;strong&gt;backwards from the first expected frost.&lt;/strong&gt; Spinach tolerates about -6C, so it goes in roughly two months before frost and stays open until about a week before. Once you know your frost date, the rest is subtraction.&lt;/p&gt;

&lt;p&gt;Sprout knows seven regions' frost dates. You ask it, it tells you what is open, what is not yet, and what window you have missed - then it explains it in a sentence and stops.&lt;/p&gt;

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

&lt;p&gt;A real run, &lt;code&gt;qwen2.5:3b&lt;/code&gt; on a CPU with no GPU:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;==================================================================
  Sprout - Friday 09 October 2026
  North India - Delhi, Punjab, Haryana
  first frost expected 20 November  (42 days away)
==================================================================

Sow now
  Broad beans   direct          to -4C    (window closes 11 Oct)
  Peas          direct          to -3C    (window closes 16 Oct)
  Spinach       direct          to -6C    (window closes 15 Nov)
  Kale          direct          to -10C   (window closes 20 Nov)
  Carrots       direct          to -5C    (window closes 31 Oct)
  Onions        start in trays  to -5C    (window closes 21 Oct)

Not yet - sow on these dates
  Cabbage       start in trays  to -8C    (in 2 days, from 11 Oct)
  Garlic        direct          to -12C   (in 30 days, from 08 Nov)

Window has closed, next season
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the part the model is actually for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Get your broad beans in this week, while the ground is still workable -
they fix their own nitrogen, so whatever you plant after them will thank
you for it. Radishes are the fastest thing on this list if you want to see
something up quickly.
NEXT: Should I soak the broad bean seeds before sowing them?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And when I asked it something it should not have had an opinion about:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sprout.py --ask "why not sow tomatoes now?"

Tomatoes aren't open for sowing in your region at the moment. They're a
warm-season crop and there isn't room for them before the last frost in
spring. Right now, radish, spinach and lettuce are the quickest things to
get into the ground.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/karan244/sprout" rel="noopener noreferrer"&gt;github.com/karan244/sprout&lt;/a&gt;&lt;/strong&gt; - MIT licensed.&lt;/p&gt;

&lt;p&gt;No &lt;code&gt;pip install&lt;/code&gt;. Standard library only, so there is no &lt;code&gt;requirements.txt&lt;/code&gt; and no virtualenv. You need Ollama and a model, and that is the entire setup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./run.sh                  &lt;span class="c"&gt;# today, your region&lt;/span&gt;
./run.sh &lt;span class="nt"&gt;--region&lt;/span&gt; uk      &lt;span class="c"&gt;# 7 regions, or --list to see them&lt;/span&gt;
./run.sh &lt;span class="nt"&gt;--no-ai&lt;/span&gt;          &lt;span class="c"&gt;# facts only, instant, no model involved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;The model is &lt;strong&gt;Qwen2.5:3B&lt;/strong&gt; running locally through Ollama. It does exactly one job, and it is not the important one.&lt;/p&gt;

&lt;h3&gt;
  
  
  The dates are arithmetic, so the dates are in code
&lt;/h3&gt;

&lt;p&gt;Every crop carries a sowing window measured in days relative to the first frost. &lt;code&gt;spinach: -60 to -5&lt;/code&gt; means sow from 60 days before frost until 5 days before it. Each region carries an approximate frost date. Deciding what is open today is then a date comparison: deterministic, instant, and identical every single run.&lt;/p&gt;

&lt;h3&gt;
  
  
  The model only explains
&lt;/h3&gt;

&lt;p&gt;This split is the entire design, and I got it wrong twice before getting it right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First attempt.&lt;/strong&gt; I handed the model the whole computed crop list and told it &lt;em&gt;not to repeat it&lt;/em&gt;. It repeated it anyway, in slightly different words, as though that counted as advice.&lt;/p&gt;

&lt;p&gt;The fix was to stop giving it something to echo. It now receives only what it &lt;strong&gt;could not already know&lt;/strong&gt;: the region, the frost date, and the planting-guide notes attached to whichever crops are currently open. Those notes are real horticultural knowledge - &lt;em&gt;"broad beans fix their own nitrogen, so they feed the soil behind them"&lt;/em&gt; - that a 3B model would not reliably have. Give it that instead of a list and it has something to add.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second bug, and a worse one.&lt;/strong&gt; The question mode had no grounding at all. I asked it &lt;em&gt;"why not sow tomatoes now?"&lt;/em&gt; and it answered:&lt;/p&gt;

&lt;p&gt;It simply agreed with me, then attached confident detail. Asking a language model a question about a system it cannot see gets you agreement, not an answer. It now receives the same three computed lists as the plan, with an explicit instruction never to advise sowing something they show as closed. That question now comes back as &lt;em&gt;"Tomatoes aren't open in your region at the moment"&lt;/em&gt;, with a suggestion of what is.&lt;/p&gt;

&lt;h3&gt;
  
  
  A southern hemisphere bug worth mentioning
&lt;/h3&gt;

&lt;p&gt;Melbourne's first frost is in &lt;strong&gt;April&lt;/strong&gt;. My original date code read that as a date that had already passed this year and printed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;first frost expected 25 April (-167 days away)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...then cheerfully reported that every crop's window had closed. Frost dates now roll forward to the correct year, which for the southern hemisphere means the next one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Things it does not do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It does not decide anything.&lt;/strong&gt; Every date in the plan comes from the code. If the model is wrong it can only make the explanation worse, never the advice wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is cool-season only.&lt;/strong&gt; Tomatoes, peppers and aubergines are timed against the &lt;em&gt;last&lt;/em&gt; frost, which is a different calculation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frost dates are regional averages&lt;/strong&gt;, deliberately rounded, not a forecast. &lt;code&gt;--first-frost&lt;/code&gt; overrides them.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./selftest.sh          &lt;span class="c"&gt;# 11 checks, about 40 seconds&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two of those checks exist because they caught real bugs: the frost roll-forward above, and the hallucinated-tomato case, kept as a regression test so it cannot come back quietly.&lt;/p&gt;

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

&lt;p&gt;The obvious reason is the same as for any local model, and it is not the interesting one here. The interesting one is that &lt;strong&gt;this project is mostly not an AI project at all.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Almost all of Sprout is arithmetic - frost dates, offsets, comparisons - and that part would be identical if no model existed. Which is exactly why it is better that way. Sowing dates are the kind of thing you do not want a language model improvising at 8am on a terrace. A 3B model will confidently tell you to plant tomatoes in October because you asked it nicely. Ordinary code cannot be talked into being wrong like that, and it costs nothing, takes no time, and works with the network off.&lt;/p&gt;

&lt;p&gt;So the division of labour became: &lt;strong&gt;let the code hold anything a beginner would act on, and let the model hold anything that benefits from sounding like a person.&lt;/strong&gt; The dates are arithmetic. "Get the broad beans in while the ground is still workable, and radishes if you want to see something up fast" is conversation - and that is the half a rulebook cannot do.&lt;/p&gt;

&lt;p&gt;The privacy argument is real too, and pointed in an unexpected direction. A gardening question is not sensitive in the way a language-practice mistake is. But &lt;strong&gt;once a tool starts talking to a hosted model, everything you type goes with it&lt;/strong&gt;, and I did not want a tool on my mother's terrace reporting her growing plans to a third-party logging pipeline. Running the model locally means I can hand her something without a privacy conversation attached, and it costs nothing to run forever.&lt;/p&gt;

&lt;p&gt;Concretely: Qwen2.5:3B on a CPU answers in a few seconds, costs nothing per query, works with the network disconnected, and sent &lt;strong&gt;zero bytes&lt;/strong&gt; off the machine during the whole demo above. The open-weight model was the only way to get the conversational half of this at all, and the open licence on the weights is why I could put it in something I would actually hand to my mother.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licence
&lt;/h2&gt;

&lt;p&gt;MIT. Model weights are Alibaba's Qwen, distributed under the Apache 2.0 licence.&lt;/p&gt;




&lt;p&gt;Built with AI coding assistance. I made every design decision, chose the model, wrote and ran every line shown above, and every transcript in this post is a real capture rather than an illustration.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>I built my friend a Spanish tutor that runs on her laptop and never phones home</title>
      <dc:creator>Karan Raj</dc:creator>
      <pubDate>Mon, 05 Oct 2026 05:51:12 +0000</pubDate>
      <link>https://dev.to/karan244/i-built-my-friend-a-spanish-tutor-that-runs-on-her-laptop-and-never-phones-home-nja</link>
      <guid>https://dev.to/karan244/i-built-my-friend-a-spanish-tutor-that-runs-on-her-laptop-and-never-phones-home-nja</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;I built a Spanish practice partner for a friend who is learning from scratch and freezes when a real person talks to her. Ordering food is the specific thing: she can read a menu, but when the waiter asks &lt;em&gt;"¿algo más?"&lt;/em&gt; she has to stop and translate in her head, and the moment passes.&lt;/p&gt;

&lt;p&gt;So I made &lt;strong&gt;LingoBuddy&lt;/strong&gt; — a terminal program she talks to instead. It holds a conversation with her in Spanish at her level, translates every line into English so she can check her own meaning, and corrects her when she drops an accent. It runs entirely on her laptop.&lt;/p&gt;

&lt;p&gt;That last part is the whole point, which I explain below.&lt;/p&gt;

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

&lt;p&gt;A real captured session, running &lt;code&gt;qwen2.5:3b&lt;/code&gt; on a CPU with no GPU:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Luna&amp;gt; ¿Quieres un café con leche, por favor?
      EN: Would you like a coffee with milk?

Priya&amp;gt; Hola, buenos dias
Luna&amp;gt; Buenos días, cómo estás hoy? ¿Te gustaría algo de tomar?
      EN: Good morning, how are you today? Would you like something to drink?
      FIX: Write "días" instead of "dias"

Priya&amp;gt; quisiera un cafe por favor
Luna&amp;gt; Claro, un café para ti. ¿Te gusta con leche o sin leche?
      EN: Sure, here's a coffee for you. Do you like it with milk or without milk?
      FIX: Write "café" instead of "cafe"

Priya&amp;gt; adios
Luna&amp;gt; Adiós, buena suerte. ¡Buen provecho!
      EN: Goodbye, good luck. Enjoy your meal!
      FIX: Write "adiós" instead of "adios"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every correction there is a missing accent she actually typed. The vocabulary command gives a card instead of continuing the conversation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Priya&amp;gt; /word desayuno
      WORD: desayuno
      MEANING: breakfast; to have breakfast
      EXAMPLE: Me desayuno a las 10 de la mañana.
      EN: I have breakfast at 10 in the morning.
      TIP: Don't confuse it with "desayunar," which means to have breakfast.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/karan244/lingobuddy" rel="noopener noreferrer"&gt;github.com/karan244/lingobuddy&lt;/a&gt;&lt;/strong&gt; — MIT licensed.&lt;/p&gt;

&lt;p&gt;It has no dependencies at all. It is pure Python standard library, so there is no &lt;code&gt;requirements.txt&lt;/code&gt;, no virtualenv, and no build step. You need &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; and a model, and that is the entire setup.&lt;/p&gt;

&lt;p&gt;It also ships with a self-test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./selftest.sh          &lt;span class="c"&gt;# 15 checks end to end&lt;/span&gt;
./selftest.sh &lt;span class="nt"&gt;--quick&lt;/span&gt;  &lt;span class="c"&gt;# skip the live model calls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That test found three real bugs while I was writing it, which is the most useful thing I can say about it.&lt;/p&gt;

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

&lt;p&gt;The model is &lt;strong&gt;Qwen2.5:3B&lt;/strong&gt;, an open-weight model from Alibaba, served locally by Ollama and reached over HTTP from inside WSL2. No API key, no account, no network call once it is running.&lt;/p&gt;

&lt;p&gt;The interesting part was not the chat loop. It was discovering that &lt;strong&gt;a small model on a CPU cannot be given several instructions at once.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The first version failed
&lt;/h3&gt;

&lt;p&gt;My first attempt asked the model for three things in a single reply: a line of Spanish, an English translation of it, and a correction of the learner. That does not work. On a 3B model I got all of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The translation silently dropped from most replies&lt;/li&gt;
&lt;li&gt;Corrections invented for mistakes the learner never made — it "corrected" her coffee order into a tea order&lt;/li&gt;
&lt;li&gt;Every reply addressed the learner by name, because it could not work out which of us was the tutor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My second attempt tried to force the format with explicit &lt;code&gt;ES:&lt;/code&gt; / &lt;code&gt;EN:&lt;/code&gt; / &lt;code&gt;FIX:&lt;/code&gt; labels and a worked example. Better, but it collapsed all three onto one line and started handing back the Spanish untranslated under an &lt;code&gt;EN:&lt;/code&gt; label.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixing it by asking for less
&lt;/h3&gt;

&lt;p&gt;Two changes fixed it, and both came from the same realisation: &lt;strong&gt;this model is reliable when asked to do exactly one thing, and unreliable otherwise.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Split the work.&lt;/strong&gt; Each turn is now two separate single-purpose calls. The tutor speaks Spanish with the conversation history attached, so it remembers. Then a second, isolated call translates that one line. Two calls at roughly two seconds each instead of one that usually came back wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Stop using the model for the checking.&lt;/strong&gt; This was the bigger lesson. Accents are a &lt;em&gt;rule&lt;/em&gt; problem, not a &lt;em&gt;judgement&lt;/em&gt; problem, so they moved into a 40-entry lookup table in plain Python.&lt;/p&gt;

&lt;p&gt;I did not arrive at that immediately. I first asked the model to reply with a fixed &lt;code&gt;"no mistakes"&lt;/code&gt; string when the sentence was fine. It emitted that exact string for &lt;strong&gt;every single input&lt;/strong&gt;, including &lt;code&gt;"i want a coffee"&lt;/code&gt; and a sentence with no mistakes in it at all. When I replaced the sentinel with a yes/no question it did slightly better and still got roughly half of them wrong, missing &lt;code&gt;quisiera un cafe&lt;/code&gt; one run and flagging &lt;code&gt;Buenos dias&lt;/code&gt; on one run and not the next.&lt;/p&gt;

&lt;p&gt;A dictionary has none of those failure modes. &lt;code&gt;check_accents()&lt;/code&gt; costs no latency, cannot hallucinate, and was right on all nine test cases immediately. I left the ambiguous words out of it on purpose — &lt;code&gt;que&lt;/code&gt;, &lt;code&gt;esta&lt;/code&gt; and &lt;code&gt;solo&lt;/code&gt; are excluded, because their unaccented forms are frequently correct and a false correction teaches the learner something wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  Other things worth knowing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A guard drops bad translations.&lt;/strong&gt; &lt;code&gt;looks_untranslated()&lt;/code&gt; counts accented characters; if a "translation" came back with two or more, it was the Spanish again, so the line is hidden rather than shown twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;gemma3:1b&lt;/code&gt; was too small.&lt;/strong&gt; I tried it first to save space and it lost the output format entirely. The README documents both so nobody repeats the experiment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finding Ollama took some work.&lt;/strong&gt; It runs on Windows and listens on the WSL bridge rather than &lt;code&gt;127.0.0.1&lt;/code&gt;, and that address changes when WSL restarts. &lt;code&gt;resolve_host()&lt;/code&gt; reads it from the routing table instead of hardcoding it, so it keeps working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No GPU here.&lt;/strong&gt; Every number above is CPU-only on a machine with 16 GB of RAM. That constraint is why the model is 3B and not 7B.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A language practice partner is a bad candidate for a hosted API, for three reasons that all mattered for this specific person.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The mistakes are the sensitive part.&lt;/strong&gt; A beginner is wrong constantly — that is the entire activity. Every wrong conjugation she typed went to a server's logs, at someone else's company, as part of someone's training data. Running it on her own machine means the failures stay private. This is the reason I chose local over a free hosted model, and it is not a close call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It has to work on a train.&lt;/strong&gt; She practises in the evening on her laptop. There is no guarantee of wifi, and a practice partner that needs a connection stops existing at exactly the moment she has time for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It has to cost nothing.&lt;/strong&gt; A hosted chat model charges per conversation, forever. This runs indefinitely on hardware she already owns.&lt;/p&gt;

&lt;p&gt;Concretely: open-weight Qwen2.5:3B on her CPU answers in about two seconds, costs zero per message, works with the network off, and sent &lt;strong&gt;zero bytes&lt;/strong&gt; off the machine during that entire demo. A closed API could have done the translation half of this well. It could not have done the privacy part, which was the requirement.&lt;/p&gt;

&lt;p&gt;I also used open tooling rather than a closed agent framework, which meant the accent checker could just be a Python function. Nothing about the split-calls design or the dictionary needed anyone's permission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licence
&lt;/h2&gt;

&lt;p&gt;MIT. Model weights are Alibaba's Qwen, distributed under the Apache 2.0 licence.&lt;/p&gt;

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