<?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: Toni Ilić</title>
    <description>The latest articles on DEV Community by Toni Ilić (@toni_ili_0579f3f1916d17b).</description>
    <link>https://dev.to/toni_ili_0579f3f1916d17b</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%2F1498881%2F91a8b88c-2258-46a3-86cd-460966b36c6c.png</url>
      <title>DEV Community: Toni Ilić</title>
      <link>https://dev.to/toni_ili_0579f3f1916d17b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/toni_ili_0579f3f1916d17b"/>
    <language>en</language>
    <item>
      <title>I let AI write 945 lessons, but I don't let it grade a single answer</title>
      <dc:creator>Toni Ilić</dc:creator>
      <pubDate>Fri, 23 Oct 2026 20:15:35 +0000</pubDate>
      <link>https://dev.to/toni_ili_0579f3f1916d17b/i-let-ai-write-945-lessons-but-i-dont-let-it-grade-a-single-answer-20e3</link>
      <guid>https://dev.to/toni_ili_0579f3f1916d17b/i-let-ai-write-945-lessons-but-i-dont-let-it-grade-a-single-answer-20e3</guid>
      <description>&lt;p&gt;I let AI write 945 lessons. I don't let it grade a single answer.&lt;/p&gt;

&lt;p&gt;That sentence is the whole design philosophy behind Labs, the newest section of &lt;a href="https://learncoachassist.com/labs" rel="noopener noreferrer"&gt;learncoachassist.com&lt;/a&gt;. Labs is a set of "Skill Paths": short interactive lessons where you answer one problem at a time, in the spirit of Brilliant or Codecademy. This post is about the engineering decision at the center of it, and the product decisions that followed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: LLMs are confidently wrong
&lt;/h2&gt;

&lt;p&gt;If you have asked a language model to do multi-step arithmetic, balance a chemical equation, or work out a physics problem, you have probably seen it. The explanation reads beautifully. The final number is wrong. And the tone never changes, so a learner has no way to tell.&lt;/p&gt;

&lt;p&gt;For a flashcard app that is a nuisance. For a lesson that says "correct!" or "try again" based on a model's guess, it is a trust problem. A learner who is told a right answer is wrong, or a wrong answer is right, learns the wrong thing and also stops trusting the product.&lt;/p&gt;

&lt;p&gt;So I made a rule: the model never decides what is correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design: templates, parameters, code
&lt;/h2&gt;

&lt;p&gt;Here is the approach, in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Vetted interactive widget templates.&lt;/strong&gt; Each kind of problem (a numeric input, a multiple choice, a "tap the problem" exercise) is a template I wrote and reviewed by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI fills in parameters and prose.&lt;/strong&gt; The model picks the values for a template and writes the explanatory text around it. That is all it does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correct answers are computed by code.&lt;/strong&gt; The answer comes from a function, never from the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lessons are pre-generated.&lt;/strong&gt; Nothing is generated live while you study. Content is created ahead of time, so it can be checked before anyone sees it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated tests cover it.&lt;/strong&gt; Lessons are written with AI and checked by automated tests.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is a simplified, illustrative sketch of the idea. It is not the real schema, just the shape of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simplified and illustrative only, not the actual implementation.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;numeric-input&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;            &lt;span class="c1"&gt;// chosen by the model, validated by code&lt;/span&gt;
  &lt;span class="na"&gt;prose&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;prose filled in by the model&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                  &lt;span class="c1"&gt;// plain code decides what is correct&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// The learner's input is compared to template.answer(template.params).&lt;/span&gt;
&lt;span class="c1"&gt;// The model is never asked "is this right?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The useful property is that the model's job and the code's job do not overlap. If the model writes a bad explanation, that is a content problem I can fix. It cannot produce a wrong grade, because it is not involved in grading. Some lessons with numeric problems also include a calculator, so the learner can focus on the idea instead of the arithmetic.&lt;/p&gt;

&lt;p&gt;On the site, this shows up as one honest line: "Created with AI. Every answer is computed by tested code."&lt;/p&gt;

&lt;h2&gt;
  
  
  Product decisions
&lt;/h2&gt;

&lt;p&gt;The architecture was half the work. The other half was deciding how the thing should feel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No account.&lt;/strong&gt; You can start a lesson without signing up. Your progress stays on your device. The site only counts anonymous starts and answers, so I can see what gets used without tracking who you are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;20 new lessons a day, free.&lt;/strong&gt; The free tier gives you 20 new lessons per day with no account. Plus or Pro removes the daily limit. I wanted the free version to be genuinely useful, not a demo with a paywall after one screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every unit is directly selectable.&lt;/strong&gt; You can jump straight to any unit. Linear-only paths are frustrating when you already know the first half of a topic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hints, daily streak, and review on every path.&lt;/strong&gt; The small mechanics that keep a short lesson habit going.&lt;/p&gt;

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

&lt;p&gt;There are 14 Skill Paths, 175 units, and 945 lessons in total:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Lessons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UX&lt;/td&gt;
&lt;td&gt;108 (20 units, the biggest path)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Physics&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Computer Science&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chemistry&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finance (educational only, not financial advice)&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Biology&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Dev&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Study Skills&lt;/td&gt;
&lt;td&gt;70 (memory, retrieval practice, spaced repetition)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Literacy&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cybersecurity Basics&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data and Statistics&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writing and Communication&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Economics&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The UX path is my favorite to play with: you compare two designs, tap the problem on a screen, and fix the spacing. It is the kind of exercise that would be hard to do well as plain text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Labs fits
&lt;/h2&gt;

&lt;p&gt;learncoachassist.com started with free flashcards (no signup), then quizzes, video lessons at /watch, Anki decks, and an AI deck generator. Flashcards are the front door. Labs is the next step: once you can recall a fact, you practice using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who built it
&lt;/h2&gt;

&lt;p&gt;I am Toni, a solo freelance web developer from Rijeka, Croatia. The stack is Laravel, PHP, Vue.js, and MySQL. It is a one-person project, which is exactly why I wanted correctness to come from tests rather than from my ability to proofread 945 lessons by eye.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it and tell me what breaks
&lt;/h2&gt;

&lt;p&gt;I would love feedback, especially from other developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the "AI writes, code grades" split match how you would design it?&lt;/li&gt;
&lt;li&gt;Which path would you want to see next?&lt;/li&gt;
&lt;li&gt;If you find a lesson with a wrong answer, I want to know. That is exactly the bug this design is meant to prevent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start here, no account needed: &lt;a href="https://learncoachassist.com/labs" rel="noopener noreferrer"&gt;https://learncoachassist.com/labs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tell me what you think in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Built 451 Micro-Lessons With AI. Here Is How I Stopped It Lying to Learners</title>
      <dc:creator>Toni Ilić</dc:creator>
      <pubDate>Thu, 08 Oct 2026 06:52:46 +0000</pubDate>
      <link>https://dev.to/toni_ili_0579f3f1916d17b/i-built-451-micro-lessons-with-ai-here-is-how-i-stopped-it-lying-to-learners-108l</link>
      <guid>https://dev.to/toni_ili_0579f3f1916d17b/i-built-451-micro-lessons-with-ai-here-is-how-i-stopped-it-lying-to-learners-108l</guid>
      <description>&lt;p&gt;Disclosure first: the lessons in this project were created with AI. I wrote the code, the structure and the checks around it, but a language model wrote a lot of the lesson text. If that bothers you, I understand, and the rest of this post is about what I did because of that fact.&lt;/p&gt;

&lt;p&gt;I'm Toni, a freelance full-stack developer in Rijeka, Croatia. I have been building a learning platform called &lt;a href="https://learncoachassist.com" rel="noopener noreferrer"&gt;LearnCoachAssist&lt;/a&gt;, and I just put a new section live: &lt;a href="https://learncoachassist.com/labs" rel="noopener noreferrer"&gt;Labs (Skill Paths)&lt;/a&gt;. From here on I will just call it Labs. It is a set of short, hands-on skill paths. One problem at a time, built for a phone, free to start, no account (20 new lessons a day on the free plan).&lt;/p&gt;

&lt;h2&gt;
  
  
  What is in Labs
&lt;/h2&gt;

&lt;p&gt;At the time of writing, Labs has nine paths, 88 units and 451 lessons. The count keeps growing, so treat these numbers as a snapshot:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Units&lt;/th&gt;
&lt;th&gt;Lessons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UX&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Biology&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chemistry&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Physics&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Computer Science&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finance&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Dev&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Study Skills&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every path has hints, a daily streak and a review mode, and every path awards a Certificate of completion once you pass all of its unit checkpoints. The certificate is self-issued: progress is recorded on your device, not verified, not accredited. Lessons are short on purpose. I wanted something you can finish on a bus, not a course you have to schedule.&lt;/p&gt;

&lt;p&gt;Two honest labels up front. Finance and Study Skills are marked educational only, and Finance is explicitly not financial advice. And in Web Dev, the code examples are simplified and read, not run in a browser. You are reading and reasoning about code there, not executing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with AI-written lessons
&lt;/h2&gt;

&lt;p&gt;Generating a lesson with an LLM is easy. Trusting it is the hard part.&lt;/p&gt;

&lt;p&gt;A model is good at fluent explanations and unreliable at the boring details: an off-by-one in a worked example, a wrong intermediate number, a "correct" multiple-choice option that is not actually correct. In an essay that is annoying. In a lesson whose entire job is to tell a learner "right" or "wrong", it is the product failing. A learner who gets marked wrong for a correct answer learns nothing except to distrust the app.&lt;/p&gt;

&lt;p&gt;So I split the work into two layers, and I treat them differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Math: AI writes the prose, code computes the answer
&lt;/h2&gt;

&lt;p&gt;On the Labs index, the Math card says it directly: "Created with AI. Every answer is computed by tested code."&lt;/p&gt;

&lt;p&gt;The idea is that the model never gets to decide what the right answer is. Each Math lesson type is a small seeded generator function that runs client side, in the browser. It takes a random seed, picks the numbers, and computes the answer in plain JavaScript. The words around it (the prompt, the hints, the explanation) are templates that interpolate those same computed values.&lt;/p&gt;

&lt;p&gt;Here is the pattern, simplified from the Pythagoras lessons. This is a sketch, not the literal source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// "Find the missing side" lesson, simplified&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pythagorasLeg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Pick a Pythagorean triple and scale it, so the answer is a clean integer&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;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pickTriple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&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;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`A right-angled triangle has a hypotenuse of &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; cm
             and one other side of &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; cm. How long is the third side?`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// Known wrong answers, each with a message that explains the mistake&lt;/span&gt;
    &lt;span class="na"&gt;commonMistakes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;That is b squared. Take the square root.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You added the squares. To find a shorter side, subtract.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You subtracted the sides. Subtract the squares instead.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;hints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="cm"&gt;/* three hints, each a bit more specific */&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;explain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`b squared = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;^2 - &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;^2 = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, so b = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;b&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="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;A few things I like about this shape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The answer is arithmetic, not opinion.&lt;/strong&gt; &lt;code&gt;b&lt;/code&gt; comes from the triple. There is no step where a model "does the math."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong answers are diagnosed.&lt;/strong&gt; If you type the square of the answer, or add instead of subtract, the lesson tells you which mistake that looks like. This is the part I would find hardest to get reliably from free-form generation, because the message is tied to the exact number you typed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hints escalate.&lt;/strong&gt; The lessons I checked have three hints, going from the general idea toward the specific step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every question is fresh.&lt;/strong&gt; Because it is seeded and generated, you can practice the same skill without seeing the same numbers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model's job is the part it is genuinely good at: writing clear explanations and designing the lesson structure. The code's job is anything that has to be exactly right.&lt;/p&gt;

&lt;h2&gt;
  
  
  The other paths: AI-written, test-checked
&lt;/h2&gt;

&lt;p&gt;I need to be careful here, because this is where it would be easy to oversell.&lt;/p&gt;

&lt;p&gt;For the other eight paths, the index card and the lesson app say: "Written with AI, checked by automated tests." That is what it is. I am not claiming that every answer in Biology or UX is computed by code the way Math is. A lot of those lessons are prose and judgment, and there is no formula that produces a correct answer to "which of these is a better button label."&lt;/p&gt;

&lt;p&gt;What the automated tests give me is a safety net around the content: structural checks on lessons, and checks that catch the kind of mistake a machine can catch. I will not pretend that is the same as an expert reviewing every lesson. It is not. The site footer asks readers to review AI-assisted deck content before relying on it, and I would ask the same of Labs. If you are making a real decision about money or health, treat Labs as a place to learn the vocabulary and build intuition, then check a proper source.&lt;/p&gt;

&lt;p&gt;I think that honesty is the actual design constraint. The more a lesson depends on judgment, the less I can verify it with code, and the more clearly it should be labeled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Small decisions that were not about AI
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Progress lives on your device.&lt;/strong&gt; No account, so your streak and progress are stored in your browser. The upside is zero friction and nothing to sign up for. The downside is that clearing site data or switching devices means starting over (the Math and UX paths can export and import a backup file). That tradeoff is deliberate for now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short lessons, one problem at a time.&lt;/strong&gt; Phone first. Less to read, fewer places to get lost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streak and review.&lt;/strong&gt; A daily streak to nudge you back, and a spaced review mode so older material comes around again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A free limit, and it is a soft one.&lt;/strong&gt; The free plan gives you 20 new Labs lessons per day, shared across all paths, resetting at your local midnight. The counter lives in your browser's localStorage, so it is a nudge, not enforcement, and if storage is blocked the limit simply does not apply. The paid plans (Plus at $10 a month, Pro at $25 a month) give unlimited Labs lessons. Ads appear on the site's deck study pages, not inside Labs lessons.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The site runs on Laravel 12 and MySQL. The Labs lessons use no front end framework: each path is its own plain JavaScript module, loaded on that path page, and the public pages use Alpine.js. In Math, the code that decides whether an answer is right runs in the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not do yet
&lt;/h2&gt;

&lt;p&gt;This is a soft launch. The Labs hub page only opened to search engines yesterday (the individual path pages are still marked noindex), so search is not sending anyone here yet, and I have no big numbers to quote. I would rather say that than invent some.&lt;/p&gt;

&lt;p&gt;I also do not have a proof that the test suite catches everything. It catches what I thought to test for. That is exactly why I want other people poking at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it and tell me what is wrong
&lt;/h2&gt;

&lt;p&gt;Start here: &lt;strong&gt;&lt;a href="https://learncoachassist.com/labs" rel="noopener noreferrer"&gt;learncoachassist.com/labs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I would really like feedback on a few things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wrong answers.&lt;/strong&gt; If a lesson marks you wrong when you are right, or the explanation is off, that is the most valuable bug report I can get.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paths that feel thin.&lt;/strong&gt; Which of the nine would you actually finish, and which feels like filler?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The AI approach.&lt;/strong&gt; If you have verified LLM-generated content in your own projects, what worked for you? I am especially curious about checks beyond "generate, then test."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The longer build note is on my site: &lt;a href="https://agicad.com/blog/learncoachassist-labs-ai-written-lessons/" rel="noopener noreferrer"&gt;LearnCoachAssist Labs, AI-written lessons&lt;/a&gt;. Drop a comment here, or reach me through &lt;a href="https://agicad.com" rel="noopener noreferrer"&gt;agicad.com&lt;/a&gt;. Thanks for reading, and for being tolerant of a soft launch.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>laravel</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I replaced Claude Cowork with DeepSeek + OpenClaw - and it mostly works</title>
      <dc:creator>Toni Ilić</dc:creator>
      <pubDate>Tue, 04 Aug 2026 15:08:47 +0000</pubDate>
      <link>https://dev.to/toni_ili_0579f3f1916d17b/i-replaced-claude-cowork-with-deepseek-openclaw-and-it-mostly-works-15j6</link>
      <guid>https://dev.to/toni_ili_0579f3f1916d17b/i-replaced-claude-cowork-with-deepseek-openclaw-and-it-mostly-works-15j6</guid>
      <description>&lt;p&gt;I said out loud to myself, "Claude Cowork is great, but I'm paying for it." Then I killed it. Well, not killed — I replaced it with DeepSeek running through OpenClaw, and it turned out to be one of the more sensible cost decisions I've made this year.&lt;/p&gt;

&lt;p&gt;Here's the honest version: it's a little less smart than Opus 5. Not far behind — but on the gnarly edge cases, I notice it. The trade is worth it. This is the story of that trade, tested on real tasks, not a benchmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;I was running Claude Cowork as my main agent alongside a bunch of other coding agents. It was good — Opus 5 is genuinely impressive. But it has a cost that adds up when you run it every day, across multiple projects, and especially when you parallelize.&lt;/p&gt;

&lt;p&gt;I switched the agent layer to &lt;strong&gt;OpenClaw&lt;/strong&gt; with &lt;strong&gt;DeepSeek v4 flash&lt;/strong&gt; as the model. The key move: &lt;strong&gt;opencode go&lt;/strong&gt; serves DeepSeek v4 flash free up to a point — which covers most of my day-to-day agent work. When I need a guaranteed paid path, DeepSeek via OpenRouter is cheap anyway (about $0.14 in / $0.28 out per 1M tokens).&lt;/p&gt;

&lt;p&gt;So the stack is: OpenClaw as the agent harness, DeepSeek v4 flash as the brain, opencode go as the free model lane.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I tested it on
&lt;/h2&gt;

&lt;p&gt;I didn't just run hello-world prompts. I ran a week of real work through it. Four tasks that actually exercise an agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chrome connection / browser automation.&lt;/strong&gt; This was the one I was most worried about. Agents that can drive a browser can break a lot of things if they're sloppy. I had it connect to a live Chrome instance and work through real pages — login flows, form filling, screenshots, verifying rendered output. It handled it. Not flawless, but it reasoned through the steps and corrected itself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A Laravel web app (cijenehr, with LearnCoachAssist in the mix).&lt;/strong&gt; Full-stack work: Blade templates, scraping adapters, deploys, fighting framework gotchas. DeepSeek is solid at Laravel — it knows the framework well enough to be productive, and it caught real bugs (including some genuinely cursed Blade comment issues).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A scripted media pipeline (agicad).&lt;/strong&gt; Automated short-form video generation publishing to Instagram, YouTube, and Facebook on a cron. Debugging a pipeline that "just stopped posting" — turned out the script library was dry, not a code bug. It reasoned to the right diagnosis instead of rewriting code it didn't need to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A multi-agent server setup.&lt;/strong&gt; Coordinating OpenClaw + a Python agent (Hermes) on a remote server, migrating models, fixing auth failures, wiring fallbacks. This is where the "a bit less smart" showed up — multi-step infrastructure reasoning is exactly the kind of edge case where a stronger model pulls ahead. But it got there, and the cost difference was enormous.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it's weaker
&lt;/h2&gt;

&lt;p&gt;Let me be straight, because this is the part that matters.&lt;/p&gt;

&lt;p&gt;DeepSeek v4 flash is not Opus 5. On straightforward, well-scoped tasks — writing code, fixing bugs, browser work — it's maybe 90-95% as good. The gap shows on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long, multi-step infrastructure reasoning where you have to hold a lot of state in your head&lt;/li&gt;
&lt;li&gt;Tasteful judgment calls on ambiguous architecture decisions&lt;/li&gt;
&lt;li&gt;The last 5% of edge-case handling that a top-tier model just instinctually nails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here's the thing: for most real work, "90% as good at 0% of the cost" is a trade I'll take every single time. And when I absolutely need the sharper model, I can reach for it — I just don't need to keep it running for everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost breakdown
&lt;/h2&gt;

&lt;p&gt;Let me be concrete about why this matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;opencode go&lt;/strong&gt; — DeepSeek v4 flash free up to a threshold. This covers the bulk of my daily agent work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cline pass&lt;/strong&gt; — a solid flat $5/month plan if you want a predictable subscription instead of worrying about free-tier limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek via OpenRouter&lt;/strong&gt; — ~$0.14 in / $0.28 out per 1M tokens as the paid floor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare that to a premium subscription running every day. The savings are basically the entire point. I'm running multiple agents in parallel — that's where the cost compounds, and where going cheap pays off the most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If you're running Claude Cowork or another premium agent and thinking "this is great but it's costing me," switching to DeepSeek + OpenClaw is a low-risk experiment. You keep the same agent workflow, you just swap the brain for something cheaper.&lt;/p&gt;

&lt;p&gt;Getting started with opencode go is free — you can try it before spending anything:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://opencode.ai/go?ref=9EPHHPPKZD" rel="noopener noreferrer"&gt;opencode go →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you go through that link, I get a small referral credit — it helps me keep writing these posts. No pressure, and honestly the free tier is enough to decide if it works for you.&lt;/p&gt;

&lt;p&gt;It's a bit less smart than Opus 5. It's not far behind. And it works. That's a trade I'm happy to make.&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
