<?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: Ryah</title>
    <description>The latest articles on DEV Community by Ryah (@ryah).</description>
    <link>https://dev.to/ryah</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%2F4160734%2F9ab58414-59ab-472d-bd13-8ce523005413.png</url>
      <title>DEV Community: Ryah</title>
      <link>https://dev.to/ryah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ryah"/>
    <language>en</language>
    <item>
      <title>She knew the sounds. The sentences kept cheating.</title>
      <dc:creator>Ryah</dc:creator>
      <pubDate>Sun, 04 Oct 2026 02:42:37 +0000</pubDate>
      <link>https://dev.to/ryah/she-knew-the-sounds-the-sentences-kept-cheating-5a5e</link>
      <guid>https://dev.to/ryah/she-knew-the-sounds-the-sentences-kept-cheating-5a5e</guid>
      <description>&lt;p&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;/p&gt;

&lt;p&gt;You can try it right now, with nothing to install: &lt;a href="https://ryahai.github.io/readable-for-her/" rel="noopener noreferrer"&gt;ryahai.github.io/readable-for-her&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;My daughter is eight, and reading is hard for her.&lt;/p&gt;

&lt;p&gt;She knows her letter sounds. The part that trips her up is pushing those sounds together into a word. And here is what nobody tells you: almost every "easy" sentence you hand a child like her is quietly unfair.&lt;/p&gt;

&lt;p&gt;Take "The duck is in the pond." It looks like baby reading. But if she hasn't been taught that ck is one sound yet, she cannot read "duck". She can only guess. And every guess teaches her that reading is guessing.&lt;/p&gt;

&lt;p&gt;If you have ever sat next to a child who is trying so hard and still can't get through the page, you know that feeling. I didn't want one more page that set her up to fail.&lt;/p&gt;

&lt;p&gt;So I built her a little reading school where every single word is one she can actually sound out.&lt;/p&gt;

&lt;p&gt;You tell it which sounds she has learned. It gives her words, sentences and tiny stories made only from those sounds. Nothing sneaks in. Then a small open AI model, running right there on your own device, picks the sentences that actually make sense, so she reads "The dog can dig" and not "The mat can dig".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9dd3rswti7a6krnus8yh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9dd3rswti7a6krnus8yh.png" alt="Today's plan: a feelings check-in, seven reading steps with a break in the middle, and a closing" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How a day goes
&lt;/h2&gt;

&lt;p&gt;She already uses a learning app at home, so I made this one look and feel the same. Nothing new to figure out except the reading.&lt;/p&gt;

&lt;p&gt;She picks a face. No name, no sign-up. Then the day goes like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How are you feeling? Any feeling is okay. If she picks a sad or worried face, she gets the calm corner first.&lt;/li&gt;
&lt;li&gt;Listen and say the word. No letters at all. I say "m ... a ... p" and she says "map".&lt;/li&gt;
&lt;li&gt;Build the word. I say the sounds, she taps the tiles.&lt;/li&gt;
&lt;li&gt;Read the word.&lt;/li&gt;
&lt;li&gt;Break time. Water, a snack, a stretch. No work.&lt;/li&gt;
&lt;li&gt;Word chains. tin, pin, pit, sit. One sound changes each time.&lt;/li&gt;
&lt;li&gt;Phrases, then sentences, then a story. Five sentences about one person. That is real reading.&lt;/li&gt;
&lt;li&gt;What went well today?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb854fagrnjduxikbem6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb854fagrnjduxikbem6a.png" alt="Building a word from sound tiles" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every word she reads earns a star and a coin. Ten stars and she levels up, with a new little friend and a new world to unlock. Coins buy rewards, and a grown-up has to say yes to each one. There is always a calm corner and a pause button within reach.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuf6o1z2ehlo7rkgfua6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuf6o1z2ehlo7rkgfua6g.png" alt="Level up: a new friend and a new world" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It also talks to her in a warm, human voice. More on that below, because I cared about it a lot.&lt;/p&gt;

&lt;p&gt;One rule I kept for myself: the app never decides she has passed. She moves up when she gets four out of five without help, on two different days, and I decide. Not the software.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ryahai.github.io/readable-for-her/" rel="noopener noreferrer"&gt;ryahai.github.io/readable-for-her&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pick a face and press Start. The listening, building and word steps open instantly. The first time you open sentences or a story, it downloads the small AI model (about 100 MB, once), and after that it is saved.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffli92i2jmr9c5k3ydr1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffli92i2jmr9c5k3ydr1v.png" alt="A sentence chosen by the model" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdge4hwodx1cxbm9ql3lu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdge4hwodx1cxbm9ql3lu.png" alt="Break time" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is also a box for grown-ups. Type any sentence from a real book and it shows you exactly which words she can't sound out yet.&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/ryahai" rel="noopener noreferrer"&gt;
        ryahai
      &lt;/a&gt; / &lt;a href="https://github.com/ryahai/readable-for-her" rel="noopener noreferrer"&gt;
        readable-for-her
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Practice sentences a beginner reader can actually sound out, ranked for sense by a small open-weight model that runs locally.
    &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;readable-for-her&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A little reading school for a child who is learning to read, where every single word is one she can
actually sound out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Try it now, nothing to install: &lt;a href="https://ryahai.github.io/readable-for-her/" rel="nofollow noopener noreferrer"&gt;https://ryahai.github.io/readable-for-her/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ryahai/readable-for-her/docs/web-today.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fryahai%2Freadable-for-her%2FHEAD%2Fdocs%2Fweb-today.png" alt="Today's plan: a feelings check-in, seven reading steps with a break in the middle, and a closing"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;A child learning to read is taught letter-sounds a few at a time. A sentence is only real practice if
every word in it can be sounded out with the sounds she has so far.&lt;/p&gt;
&lt;p&gt;Most "easy" sentences fail that test. "The duck is in the pond" looks like beginner material. But a
child who has not yet been taught that ck is one sound cannot read "duck". She can only guess, and
guessing is the habit you are trying not to build.&lt;/p&gt;
&lt;p&gt;So you tell this which sounds she has learned, and it gives her words, sentences and tiny stories made
only from those sounds. A small open model, running on your own device, then picks the…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ryahai/readable-for-her" 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;I knew what my daughter needed and I set the rules. An AI coding agent (Claude Code) wrote the code, the tests and this write-up, to my direction. I am telling you that plainly because it matters.&lt;/p&gt;

&lt;p&gt;The idea is simple, and it has two halves.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rules decide what she can read
&lt;/h3&gt;

&lt;p&gt;A word only gets in if it can be split into sounds she has been taught. No exceptions, and there are tests that check every word at every level.&lt;/p&gt;

&lt;h3&gt;
  
  
  A small AI decides what makes sense
&lt;/h3&gt;

&lt;p&gt;Rules alone will happily write "A mat can dig." They don't know a dog is the one that digs. So every possible sentence is shown to &lt;a href="https://huggingface.co/HuggingFaceTB/SmolLM2-135M-Instruct" rel="noopener noreferrer"&gt;SmolLM2&lt;/a&gt;, a tiny open model, and it keeps the ones that sound like something a person would really say. "The cat sat on a mat" beat "The mat sat on a cat."&lt;/p&gt;

&lt;p&gt;The AI never writes a single word. It only chooses. A tiny model that writes will break the spelling rules. A tiny model that only picks can't hurt anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  It all runs in your browser
&lt;/h3&gt;

&lt;p&gt;No server, no account, nothing sent anywhere. It's a page for a child. It should not be watching her.&lt;/p&gt;

&lt;h3&gt;
  
  
  The voice
&lt;/h3&gt;

&lt;p&gt;The first version used the computer's built-in voice and it sounded like a robot. I hated it. A child who is already nervous about reading does not need a robot talking at her. So every line the app says was recorded once with &lt;a href="https://huggingface.co/hexgrad/Kokoro-82M" rel="noopener noreferrer"&gt;Kokoro&lt;/a&gt;, an open voice model, and now everyone hears the same gentle voice in any browser.&lt;/p&gt;

&lt;p&gt;The one thing the voice does not do is say the letter sounds. I do that. A child learns to blend from a real person saying the sounds, and a machine gets single sounds wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  What went wrong along the way
&lt;/h3&gt;

&lt;p&gt;The first page it made was the same sentence eight times with different words. The AI loved short, boring patterns. Now it has to mix them up.&lt;/p&gt;

&lt;p&gt;It once offered her "sock" as s-o-c-k. That is the exact mistake this whole thing exists to stop. It is fixed, and there is a test with the word "sock" in it so it can never come back.&lt;/p&gt;

&lt;p&gt;The first browser version froze the whole page while the AI was thinking. Now the AI works in the background and the page stays alive.&lt;/p&gt;

&lt;p&gt;It runs on my 8 GB laptop, which is saying something.&lt;/p&gt;

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

&lt;p&gt;Because this could not exist any other way.&lt;/p&gt;

&lt;p&gt;It runs where she is. After the first load it needs no internet. A child's reading page should not depend on a connection, a login or a subscription.&lt;/p&gt;

&lt;p&gt;It costs nothing. I can make her a fresh page every day without counting pennies.&lt;/p&gt;

&lt;p&gt;Nothing is hidden. The words are in a file. The sentence patterns are in a file. If your child's school teaches the sounds in a different order, you can change it. If a better small model comes out, you can swap it in. Try doing that with a reading app you rent.&lt;/p&gt;

&lt;p&gt;And honestly, a big closed model would have been the wrong tool even for free. I didn't need something clever. I needed something small, private and kind that could sit inside a web page on a child's device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handing it over
&lt;/h2&gt;

&lt;p&gt;I tested the finished command-line tool with her, using the story step. She tried it and it worked well.&lt;/p&gt;

&lt;p&gt;That is what I built this for.&lt;/p&gt;

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

&lt;p&gt;Overall prize only. This project does not use any partner technology.&lt;/p&gt;

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