<?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: Savindu Thathsara</title>
    <description>The latest articles on DEV Community by Savindu Thathsara (@savinduthathsara).</description>
    <link>https://dev.to/savinduthathsara</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%2F481859%2F46560e15-e7a5-4c9c-9b85-dd3a5dd0d716.png</url>
      <title>DEV Community: Savindu Thathsara</title>
      <link>https://dev.to/savinduthathsara</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/savinduthathsara"/>
    <language>en</language>
    <item>
      <title>The Words Appear While You Talk</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sun, 25 Oct 2026 10:37:50 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/the-words-appear-while-you-talk-5a4l</link>
      <guid>https://dev.to/savinduthathsara/the-words-appear-while-you-talk-5a4l</guid>
      <description>&lt;h1&gt;
  
  
  The Words Appear While You Talk
&lt;/h1&gt;

&lt;p&gt;The ThinkPad microphone was already on. A two-second recording peaked at 4976, and the listener's first frames peaked at 2852.&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the laptop.&lt;/p&gt;

&lt;p&gt;The card is the Intel HDA device, codec ALC257. The internal mic boost is at 30 dB, the top of that control. What was missing was the picture. The voice session now opens the Hearthlen chat, and while you are still talking the words land in a "You" line and in the box at the bottom. A spoken "how are you" from this desk became &lt;code&gt;caption 'How are you?'&lt;/code&gt; and then &lt;code&gt;heard='How are you?'&lt;/code&gt; in 373 ms. At 10:37 the window showed that line, under "Hi, Savindu.", with the reply beneath it.&lt;/p&gt;

&lt;p&gt;Room noise can make the transcriber repeat one short phrase. A line that does that is thrown away, and a phrase only starts once it is louder than the noise floor measured at startup, which was 833 this time.&lt;/p&gt;

&lt;p&gt;The session those words belong to opens from &lt;a href="//19-win-v-opens-the-voice.md"&gt;Win+V&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Win+V Opens the Voice</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sun, 25 Oct 2026 10:29:07 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/winv-opens-the-voice-5dlo</link>
      <guid>https://dev.to/savinduthathsara/winv-opens-the-voice-5dlo</guid>
      <description>&lt;h1&gt;
  
  
  Win+V Opens the Voice
&lt;/h1&gt;

&lt;p&gt;Super+V on the ThinkPad, and the voice agent opened in that same second.&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the laptop.&lt;/p&gt;

&lt;p&gt;Win+H was already the chat window, from &lt;a href="//13-win-h-opens-the-chat.md"&gt;Win+H opens the chat&lt;/a&gt;. Win+V now asks the listener to start the spoken session, the same one "hey Hearthlen" starts. It says hello and then keeps the microphone. The key went out at &lt;strong&gt;10:28:14&lt;/strong&gt;. The log line is &lt;code&gt;voice: Win+V&lt;/code&gt; at &lt;strong&gt;10:28:14&lt;/strong&gt;. &lt;code&gt;session open&lt;/code&gt; is &lt;strong&gt;10:28:16&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The conversation those keys open is in &lt;a href="//18-a-conversation-then-the-work.md"&gt;a conversation, then the work&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A Conversation, Then the Work</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sun, 25 Oct 2026 10:23:21 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/a-conversation-then-the-work-2o8g</link>
      <guid>https://dev.to/savinduthathsara/a-conversation-then-the-work-2o8g</guid>
      <description>&lt;h1&gt;
  
  
  A Conversation, Then the Work
&lt;/h1&gt;

&lt;p&gt;The wake word answered once and then went quiet. A person does not talk to a command line.&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the ThinkPad.&lt;/p&gt;

&lt;p&gt;After "hey Hearthlen" the microphone stays open. Three agents share the sentence. The voice agent talks, and the small model stays loaded so the next reply does not pay for another startup. The device agent handles the volume, the brightness, files, reminders, and Wi-Fi. The desk agent takes the sentences that start work, create, open, write, and the rest, and it uses the keyboard and mouse on a background thread. The voice says it will do that, and it keeps listening. Eight quiet seconds ends the session.&lt;/p&gt;

&lt;p&gt;The voice agent, already loaded, answered three different sentences on the laptop. "how are you" came back in &lt;strong&gt;437 ms&lt;/strong&gt;. "what should we do today" came back in &lt;strong&gt;356 ms&lt;/strong&gt;. "tell me a short joke" came back in &lt;strong&gt;346 ms&lt;/strong&gt;. A recording of the wake phrase from this desk scored &lt;strong&gt;0.25&lt;/strong&gt;, so that pass never opened the session.&lt;/p&gt;

&lt;p&gt;The previous ear is in &lt;a href="//17-the-wake-word-trained-here.md"&gt;the wake word trained on this Mac&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>The Wake Word Trained on This Mac</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sun, 25 Oct 2026 10:11:31 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/the-wake-word-trained-on-this-mac-2ch</link>
      <guid>https://dev.to/savinduthathsara/the-wake-word-trained-on-this-mac-2ch</guid>
      <description>&lt;h1&gt;
  
  
  The Wake Word Trained on This Mac
&lt;/h1&gt;

&lt;p&gt;I said “hey Hearthlen” from the next machine. The ThinkPad logged score &lt;strong&gt;0.99&lt;/strong&gt;. The sentence before it, “open the browser”, did not wake it.&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the two computers sitting together.&lt;/p&gt;

&lt;p&gt;The earlier listener, in &lt;a href="//16-the-name-it-hears.md"&gt;the name it hears&lt;/a&gt;, transcribed a burst and then guessed. The same phrase came back as Hertzland, Herthlin, and once as something that was not the name at all. There is no published model for this name. openWakeWord already publishes the mel network and the speech-embedding network, and those stay frozen. I trained only the small phrase head, on this Mac, from offline speech, and copied the three files to the ThinkPad. The listener scores each 80 ms of microphone audio on the laptop. It does not download a model when someone says the name.&lt;/p&gt;

&lt;p&gt;The holdout from that training run was positives &lt;strong&gt;0.96&lt;/strong&gt;, negatives &lt;strong&gt;0.04&lt;/strong&gt;, recall &lt;strong&gt;0.91&lt;/strong&gt;, false accepts &lt;strong&gt;0.00&lt;/strong&gt;. The laptop uses threshold &lt;strong&gt;0.97&lt;/strong&gt;. The phrase finished at 10:06:48.494 and the log line is that same second, score &lt;strong&gt;0.98&lt;/strong&gt;. A later pass scored &lt;strong&gt;0.99&lt;/strong&gt;, said hello, and heard the next sentence: &lt;code&gt;Turn the volume up.&lt;/code&gt; Speech-to-text took &lt;strong&gt;367 ms&lt;/strong&gt;. The turn took &lt;strong&gt;1914 ms&lt;/strong&gt;. With the speaker turned down to 46, the same phrase scored &lt;strong&gt;0.91&lt;/strong&gt; and stayed quiet.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>The Name It Hears</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sun, 25 Oct 2026 09:19:52 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/the-name-it-hears-3f28</link>
      <guid>https://dev.to/savinduthathsara/the-name-it-hears-3f28</guid>
      <description>&lt;h1&gt;
  
  
  The Name It Hears
&lt;/h1&gt;

&lt;p&gt;I said “hey Hearthlen” from the next machine. The ThinkPad microphone recorded it, and the wake listener did nothing.&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the two computers sitting together.&lt;/p&gt;

&lt;p&gt;The old listener was PocketSphinx, waiting for “hey hearth” and “hard one”, because that is what an English dictionary makes of a made-up name. On this recording Whisper heard “Hey, Hertzland.” The keyword list, at its most sensitive setting, scored &lt;strong&gt;0&lt;/strong&gt; hits.&lt;/p&gt;

&lt;p&gt;The listener now transcribes a short burst and accepts the name as it actually comes out: hearthlin, herthlin, hertzland. The burst that woke it took &lt;strong&gt;340 ms&lt;/strong&gt;. The log line was &lt;code&gt;wake: hey hearthlen&lt;/code&gt;, one second after the phrase ended, and it gave the greeting.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>He Asked for an Animation and Got a Form</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sun, 25 Oct 2026 00:50:46 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/he-asked-for-an-animation-and-got-a-form-2o72</link>
      <guid>https://dev.to/savinduthathsara/he-asked-for-an-animation-and-got-a-form-2o72</guid>
      <description>&lt;h1&gt;
  
  
  He Asked for an Animation and Got a Form
&lt;/h1&gt;

&lt;p&gt;“create html animation” came back as another form, because every HTML sentence was pushed through a form fence, and the animation sentence had been saved as the answer to “what should I type?”&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the ThinkPad.&lt;/p&gt;

&lt;p&gt;The fence is the one in &lt;a href="//14-six-inputs.md"&gt;six inputs means six boxes&lt;/a&gt;. A 360M model, asked for a page, copies the instruction and invents tags. The fence stops that, and it also means the only page it can produce is a form. An animation does not fit in it.&lt;/p&gt;

&lt;p&gt;Two things changed. A sentence that starts a new task is no longer glued onto the previous question. And a page is written by Qwen2.5-Coder 1.5B, on the laptop, then pasted into the editor, saved, and opened. The sentence is the brief. &lt;code&gt;create html animation&lt;/code&gt; became a red square that slides, in &lt;strong&gt;19233 ms&lt;/strong&gt;, of which the coder spent &lt;strong&gt;8220 ms&lt;/strong&gt;. &lt;code&gt;create a circle animation in html&lt;/code&gt; became a red circle that moves, in &lt;strong&gt;26338 ms&lt;/strong&gt;, of which the coder spent &lt;strong&gt;14347 ms&lt;/strong&gt;. Chromium is showing &lt;code&gt;/home/savindu/page-3.html&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Six Inputs Means Six Boxes</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sun, 25 Oct 2026 00:26:22 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/six-inputs-means-six-boxes-12g4</link>
      <guid>https://dev.to/savinduthathsara/six-inputs-means-six-boxes-12g4</guid>
      <description>&lt;h1&gt;
  
  
  Six Inputs Means Six Boxes
&lt;/h1&gt;

&lt;p&gt;“create an html form with 6 inputs” used to come back with two boxes, because two was written into the step and the 6 was ignored.&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the ThinkPad.&lt;/p&gt;

&lt;p&gt;The two-box form was a fence. A 360M model, asked for “some HTML”, copied the instruction and invented tags, which is the failure in &lt;a href="//11-it-wrote-a-form-and-filled-it.md"&gt;it wrote a form and filled it&lt;/a&gt;. The fence made a valid form, and it also threw away the number you said.&lt;/p&gt;

&lt;p&gt;The number in the sentence is now how many inputs get written. The model still chooses the names. On this run it chose &lt;code&gt;input1&lt;/code&gt; through &lt;code&gt;input6&lt;/code&gt;, saved &lt;code&gt;/home/savindu/one-6.html&lt;/code&gt;, and opened that file. The clock was &lt;strong&gt;17707 ms&lt;/strong&gt;. The sentence did not say to fill the boxes, so it stopped. If the sentence leaves out the number, he asks how many.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Win+H Opens the Chat</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sun, 25 Oct 2026 00:18:34 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/winh-opens-the-chat-24c9</link>
      <guid>https://dev.to/savinduthathsara/winh-opens-the-chat-24c9</guid>
      <description>&lt;h1&gt;
  
  
  Win+H Opens the Chat
&lt;/h1&gt;

&lt;p&gt;The capture slider was at 30 dB, a two-second sample peaked at 32768, and “hey Hearthlen” never arrived.&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the ThinkPad.&lt;/p&gt;

&lt;h2&gt;
  
  
  The microphone was a square wave
&lt;/h2&gt;

&lt;p&gt;32768 is the top of a 16-bit sample. At that gain the room itself was already clipping, so the wake phrase had no shape left to match. The listener now turns the capture slider down when it is above 60%. After that the meter read &lt;strong&gt;5.25 dB&lt;/strong&gt;, and the first frames it saw peaked at &lt;strong&gt;977&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The English model also does not hear the made-up name as the spelling. On a clear reading it hears “hey hearth” and “hard one”. Those are the phrases it waits for. Playing “hey hearthlen” through the speakers then logged &lt;code&gt;wake: hey hearthlen&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The window
&lt;/h2&gt;

&lt;p&gt;Win+H opens a window titled &lt;strong&gt;Hearthlen chat&lt;/strong&gt;. A line in that box is the same command the voice path uses. &lt;code&gt;what can you do&lt;/code&gt; came back in the window: keyboard and mouse, volume, brightness, find a file, a reminder, and a screenshot. The face in the corner still moves while the reply is spoken, as in &lt;a href="//09-hi-savindu-and-the-pointer.md"&gt;Hi, Savindu, and the pointer moved&lt;/a&gt;. A message can also be the answer to a question he asked, the way &lt;a href="//12-it-asked-what-to-type.md"&gt;it asked what to type&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The check still open is a person in the room saying the phrase, timed from the first sound to the greeting.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>It Asked What to Type</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sun, 25 Oct 2026 00:07:55 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/it-asked-what-to-type-4b7c</link>
      <guid>https://dev.to/savinduthathsara/it-asked-what-to-type-4b7c</guid>
      <description>&lt;h1&gt;
  
  
  It Asked What to Type
&lt;/h1&gt;

&lt;p&gt;“create an html form and fill it” came back as a question in 2486 milliseconds, and none of the html files on the desktop changed.&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the ThinkPad.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question, then the fields
&lt;/h2&gt;

&lt;p&gt;The sentence does not say what belongs in the boxes. The agent asked &lt;strong&gt;What should I type?&lt;/strong&gt; and waited. The reply was “use the name Sam and the email &lt;a href="mailto:sam@example.com"&gt;sam@example.com&lt;/a&gt;”.&lt;/p&gt;

&lt;p&gt;That second run took &lt;strong&gt;18983 ms&lt;/strong&gt;. It opened FeatherPad, saved &lt;code&gt;/home/savindu/one-3.html&lt;/code&gt;, opened that file in Chromium, and typed the two answers. The file is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;sam&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The page showed &lt;code&gt;Sam&lt;/code&gt; in the first box and &lt;code&gt;sam@example.com&lt;/code&gt; in the second. The window title was &lt;code&gt;one-3.html - Chromium&lt;/code&gt;. The earlier run, which invented both values, is &lt;a href="//11-it-wrote-a-form-and-filled-it.md"&gt;it wrote a form and filled it&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going back to the bad step
&lt;/h2&gt;

&lt;p&gt;Each action is numbered. After a save, the agent reads the first 200 characters of the file it just wrote. A form request whose file has no form tag means the typing step was the mistake. That step is dropped, FeatherPad is the window to open, and the line is written again. Two tries, then it says the page is still wrong.&lt;/p&gt;

&lt;p&gt;A file that contained the words “not a form” pointed at step 3, the typing step, and the history went back to opening the editor. &lt;code&gt;one-3.html&lt;/code&gt; was a form on the first try, so this run did not have to go back. The same hands still type an address the way they did in &lt;a href="//07-it-typed-the-address-itself.md"&gt;it typed the address itself&lt;/a&gt;. The next check is the same question spoken after “hey Hearthlen”.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>It Wrote a Form and Filled It</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sat, 24 Oct 2026 23:57:16 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/it-wrote-a-form-and-filled-it-381n</link>
      <guid>https://dev.to/savinduthathsara/it-wrote-a-form-and-filled-it-381n</guid>
      <description>&lt;h1&gt;
  
  
  It Wrote a Form and Filled It
&lt;/h1&gt;

&lt;p&gt;The sentence was “create an html form and fill it”. Forty-nine seconds later the browser showed two filled boxes.&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the ThinkPad, still offline, still the 360M model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the sentence produced
&lt;/h2&gt;

&lt;p&gt;The agent opened FeatherPad, typed a form, saved it, opened that file in Chromium, and typed into both fields. The clock for the whole run was &lt;strong&gt;48881 ms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The saved file, &lt;code&gt;/home/savindu/one-2.html&lt;/code&gt;, is one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;goaltype&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;goaltype&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The address bar read &lt;code&gt;file:///home/savindu/one-2.html&lt;/code&gt;. Both inputs contained &lt;code&gt;onehtmlfile&lt;/code&gt;. The window title was &lt;code&gt;one-2.html - Chromium&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The model chose the field name and the value. The grammar only allowed a form with two inputs, a new &lt;code&gt;.html&lt;/code&gt; name, and a short word in each box. Without that fence the same sentence failed twice. The first save began with the instruction itself. The second was a string of invented tags, and the agent then typed that string into the page. A model this small will echo the prompt if the next word can be anything.&lt;/p&gt;

&lt;p&gt;The hands are the same ones that typed a website address in &lt;a href="//07-it-typed-the-address-itself.md"&gt;it typed the address itself&lt;/a&gt;: look at the window, take one action, look again. No special “make a form” function. The next check is the same sentence spoken after “hey Hearthlen”, with the voice from &lt;a href="//10-a-warmer-voice.md"&gt;the warmer voice&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The Voice Stopped Sounding Like a Radio</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sat, 24 Oct 2026 23:44:10 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/the-voice-stopped-sounding-like-a-radio-4emb</link>
      <guid>https://dev.to/savinduthathsara/the-voice-stopped-sounding-like-a-radio-4emb</guid>
      <description>&lt;h1&gt;
  
  
  The Voice Stopped Sounding Like a Radio
&lt;/h1&gt;

&lt;p&gt;“Hi, Savindu.” came back in 1939 milliseconds, and the voice was no longer the flat low-quality one.&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the same ThinkPad.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;The earlier voice was Piper’s &lt;code&gt;en_GB-alan-low&lt;/code&gt;. Low is small and fast, and it sounds flat. The new file is &lt;code&gt;en_US-lessac-medium&lt;/code&gt;, a narrator recording at medium quality, 63,201,294 bytes. Speech is a little slower than the default, and there is a quarter-second of quiet after a sentence, so “Hi, Savindu.” has a breath in the comma.&lt;/p&gt;

&lt;p&gt;A longer line, “Hi, Savindu. What would you like me to do?”, made &lt;strong&gt;3.21 seconds&lt;/strong&gt; of audio and returned in &lt;strong&gt;3753 ms&lt;/strong&gt;. The greeting itself, synthesis plus playback, was &lt;strong&gt;1939 ms&lt;/strong&gt;. That sits next to the old short-sentence figure of 2048 ms in &lt;a href="//05-hey-hearthlen-opened-youtube.md"&gt;the reaction notes&lt;/a&gt;. The face still moves while this plays, as in &lt;a href="//09-hi-savindu-and-the-pointer.md"&gt;the pointer note&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The listener was restarted. The next “hey Hearthlen” uses this voice.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Hi Savindu, and the Pointer Moved</title>
      <dc:creator>Savindu Thathsara</dc:creator>
      <pubDate>Sat, 24 Oct 2026 23:42:06 +0000</pubDate>
      <link>https://dev.to/savinduthathsara/hi-savindu-and-the-pointer-moved-2f1a</link>
      <guid>https://dev.to/savinduthathsara/hi-savindu-and-the-pointer-moved-2f1a</guid>
      <description>&lt;h1&gt;
  
  
  Hi Savindu, and the Pointer Moved
&lt;/h1&gt;

&lt;p&gt;The pointer did not jump. It left the middle of the screen, arrived at the address bar, and then came down into the page. Firefox was showing the Debian homepage.&lt;/p&gt;

&lt;p&gt;Savindu Thathsara, &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;savithathsara.me&lt;/a&gt;. This is a Hearthlen note from the same ThinkPad.&lt;/p&gt;

&lt;h2&gt;
  
  
  The sentence and the rings together
&lt;/h2&gt;

&lt;p&gt;“Hey Hearthlen” now answers “Hi Savindu.” before it waits for the job. The face is its own process, so the rings move while the voice is playing, not after it. Two pictures taken during that one sentence, 0.4 seconds apart, do not match. In the first, the bright point sits on the lower right of the rings. In the second, it is on the upper left. That is the speaking motion from &lt;a href="//08-a-face-you-can-film.md"&gt;the previous note&lt;/a&gt;, running at the same time as the words.&lt;/p&gt;

&lt;h2&gt;
  
  
  A page, with the pointer in view
&lt;/h2&gt;

&lt;p&gt;“Open the debian website” returned in &lt;strong&gt;7691 ms&lt;/strong&gt;. The small model chose Firefox. Sampled on the way, the pointer went from about 901, 498 to about 650, 128 at the address bar, then to about 650, 529 inside the page. The window title was “Debian -- The Universal Operating System — Mozilla Firefox”.&lt;/p&gt;

&lt;p&gt;The agent does not try to slip past a robot check. This visit was the normal Firefox window, with a pointer a person can watch.&lt;/p&gt;




&lt;p&gt;Savindu Thathsara builds practical AI and automation in London. This series is the public log of an offline AI operating system he is writing and learning at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://savithathsara.me" rel="noopener noreferrer"&gt;https://savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:savindu@savithathsara.me"&gt;savindu@savithathsara.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEV: &lt;a href="https://dev.to/savinduthathsara"&gt;https://dev.to/savinduthathsara&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
