<?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: İclal Doğan</title>
    <description>The latest articles on DEV Community by İclal Doğan (@iclaldogan).</description>
    <link>https://dev.to/iclaldogan</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%2F3954902%2F2bd39086-cd3f-4b07-9bd7-f830c749f7ea.jpg</url>
      <title>DEV Community: İclal Doğan</title>
      <link>https://dev.to/iclaldogan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iclaldogan"/>
    <language>en</language>
    <item>
      <title>THE UNHEARD: A Game That Sends You Outside, Teaches a Machine to Listen, and Makes It Prove Every Word</title>
      <dc:creator>İclal Doğan</dc:creator>
      <pubDate>Mon, 12 Oct 2026 00:48:29 +0000</pubDate>
      <link>https://dev.to/iclaldogan/the-unheard-a-game-that-sends-you-outside-teaches-a-machine-to-listen-and-makes-it-prove-every-43go</link>
      <guid>https://dev.to/iclaldogan/the-unheard-a-game-that-sends-you-outside-teaches-a-machine-to-listen-and-makes-it-prove-every-43go</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 Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;THE UNHEARD&lt;/strong&gt; is an acoustic-memory game where the machine knows the name of every sound and has never heard one.&lt;/p&gt;

&lt;p&gt;You meet &lt;strong&gt;ECHO-0&lt;/strong&gt;, a mind that has read about rain, bells and footsteps ten thousand times and holds no memory of any of them. The game asks you to do the one thing a screen cannot: go outside, record something that is really there, and bring it back. You tell ECHO-0 what you heard. It guesses, gets things wrong, takes your correction, and remembers. By the end, the sounds you collected are an orchestra.&lt;/p&gt;

&lt;p&gt;The design principle is &lt;strong&gt;"The Model Never Changes. The Memory Does."&lt;/strong&gt; Nothing in this project trains or fine-tunes anything. A frozen audio model hears; a retrieval memory keeps what &lt;em&gt;you&lt;/em&gt; taught it; a local Gemma speaks. Three separate mechanisms, never blurred.&lt;/p&gt;

&lt;p&gt;It is a local-first app (a React PWA, a FastAPI server, SQLite, CPU audio embeddings, and Gemma through Ollama) with six scenes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scene&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chamber&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ECHO-0 waits and says, honestly, how much it has heard so far.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Field&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Record a real sound. It is saved in the browser first, even offline, and uploaded when you choose.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hearing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A local CLAP model proposes what the sound might be, as similarity scores, never fake probabilities. You confirm, correct, rename, or say "I don't know."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Specimen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every recording becomes a visual artifact generated deterministically from its measured acoustics. Same sound, same shape.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Atlas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your recordings placed by how alike they actually sound, with the names you gave them.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Orchestra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pick three or more taught sounds and ECHO-0 composes from the recordings themselves, with stems you can mute and solo and a WAV you can keep.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The ending is not scripted. It unlocks only when a real composition exists, built from at least three recordings you named.&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%2Fzy8n5qir77jm1898tbc8.jpg" 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%2Fzy8n5qir77jm1898tbc8.jpg" alt=" " width="800" height="1579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Hearing Room. CLAP's own ears put "Church bells" at cosine 0.367. The name the player taught, "Bells", has a memory similarity of 0.844 from two remembered examples, so memory ranks it first. These are similarity scores, not probabilities.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How it gets people off the screen
&lt;/h3&gt;

&lt;p&gt;The prompt says: make the screen the shortest part. We took it literally, and then we felt how hard it is.&lt;/p&gt;

&lt;p&gt;A game about sound should not be played on a screen. The screen is only where the machine keeps its notes. The part that matters happens when you stand in a street at an hour you have never listened to, hold up a phone, and realise you could not have told anyone what that street sounds like. Teaching ECHO-0 to name a sound turned out to be the fastest way to notice how many we had never heard ourselves.&lt;/p&gt;

&lt;p&gt;That is why the interface is calm and sparse, why the hearing room shows honest similarity numbers instead of confident percentages, and why the machine asks you instead of pretending. It is a game that wants you to close the laptop.&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%2Fza1qwtxk6xvpfmyszfye.jpg" 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%2Fza1qwtxk6xvpfmyszfye.jpg" alt=" " width="780" height="3054"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Before you play
&lt;/h3&gt;

&lt;p&gt;Be ready for a &lt;strong&gt;laptop-first&lt;/strong&gt; experience: capture works offline on the phone, but hearing, memory, composition and Gemma all run on your laptop. This is not an on-device AI app, and we would rather say so than let you find out. For the phone to use its microphone it needs trusted HTTPS, so the repo includes a one-command local certificate setup and a server flag that serves the app itself over TLS. We have written the Android field test up, but we have &lt;strong&gt;not yet performed it on a physical phone&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Taking it outside — current status
&lt;/h3&gt;

&lt;p&gt;This is where we owe you the most honesty. The game is built around leaving the screen, and &lt;strong&gt;we did not complete that outing for this submission.&lt;/strong&gt; The Android field test is written up (&lt;code&gt;docs/ANDROID-FIELD-TEST.md&lt;/code&gt;) and its results table is empty. Our automated browser runs used desktop Chrome with a simulated microphone and prove nothing about phones. We would rather hand you a clear gap than a made-up trail story.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/88xiuN7ZJOQ" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Fifty seconds, narrated and scored. Everything on screen is the real app running on the generated set: real CLAP inference, real taught names, a real Composed render.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the demo audio
&lt;/h3&gt;

&lt;p&gt;Here is the part we owe you plainly. The demo sounds were &lt;strong&gt;generated with the ElevenLabs sound-effects API&lt;/strong&gt;. They are not field recordings. The narration in the video is an ElevenLabs voice, and the music is the app's own Composed render of those generated sounds.&lt;/p&gt;

&lt;p&gt;Why: the only audio we had for testing was a research dataset that is licensed for non-commercial use and cannot appear in a public demo. We first synthesised a publishable set from scratch in NumPy (it is in the repo, deterministic, free to reproduce), then regenerated it with ElevenLabs so the demo would sound like something. The project still does exactly what it claims with real recordings, but we are not going to dress generated rain up as a hike.&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/miclaldogan" rel="noopener noreferrer"&gt;
        miclaldogan
      &lt;/a&gt; / &lt;a href="https://github.com/miclaldogan/the-unheard" rel="noopener noreferrer"&gt;
        the-unheard
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      THE UNHEARD: an orchestra made of a world you almost forgot to hear (Hacktoberfest 2026, Touch Grass)
    &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;THE UNHEARD&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;An orchestra made of a world you almost forgot to hear.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ECHO-0 knows the world’s names but has lost its acoustic memory. Go outside, collect a sound
return to the laboratory, teach it what you heard, and listen as your memories become a composition
A local-first React PWA, FastAPI, SQLite, CPU LAION-CLAP and local Gemma through Ollama power the experience.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Release&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt; contains the complete project: the M5 narrative backend, the cinematic UI, the M5.5 integration and the M6
final validation (the pre-inference teaching race is fixed, HTTPS can be served by the backend itself, review
tooling and submission drafts; see &lt;a href="https://github.com/miclaldogan/the-unheard/docs/M6-FINAL-REPORT.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/M6-FINAL-REPORT.md&lt;/code&gt;&lt;/a&gt;). M7 adds a publishable
synthetic audio set so the project can demonstrate itself without ESC-50
(&lt;a href="https://github.com/miclaldogan/the-unheard/docs/M7-SYNTHETIC-AUDIO.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/M7-SYNTHETIC-AUDIO.md&lt;/code&gt;&lt;/a&gt;)
The six scenes are &lt;strong&gt;Chamber → Field → Hearing → Specimen → Atlas → Orchestra&lt;/strong&gt;.
Recording, classification, annotation, retrieval memory, measured visual artifacts, composition,
playback and…&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/miclaldogan/the-unheard" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;MIT licensed. Model weights are downloaded locally and are never in the repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/miclaldogan/the-unheard
&lt;span class="nb"&gt;cd &lt;/span&gt;the-unheard/server
uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--extra&lt;/span&gt; ml
uv run unheard fetch-model          &lt;span class="c"&gt;# one-time CLAP download&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ../web &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm ci &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run build
&lt;span class="nb"&gt;cd&lt;/span&gt; ../server
&lt;span class="nv"&gt;UNHEARD_NARRATIVE_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gemma3:4b uv run unheard serve   &lt;span class="c"&gt;# http://127.0.0.1:8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;ECHO-0 is three things that never pretend to be each other.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The part that hears: LAION-CLAP.&lt;/strong&gt; &lt;a href="https://huggingface.co/laion/clap-htsat-unfused" rel="noopener noreferrer"&gt;&lt;code&gt;laion/clap-htsat-unfused&lt;/code&gt;&lt;/a&gt; turns audio into a 512-dimensional embedding and scores it against text labels, on CPU. It is frozen. Nothing here trains it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The part that learns: retrieval memory, not training.&lt;/strong&gt; When you name a sound, its embedding is stored as an &lt;em&gt;exemplar&lt;/em&gt; of your label. Later predictions fuse CLAP's scores with nearest-neighbour similarity to your exemplars, and the interface shows which one is speaking. On the demo set, we taught two "Roof gutter" clips. On a third clip it had never heard, that name was absent from the top three before teaching (Rain, Bicycle, Lawn mower) and &lt;strong&gt;first&lt;/strong&gt; afterwards. The model did not change. The memory did.&lt;/li&gt;
&lt;/ul&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%2Fx1unjiai46hu83ukide7.jpg" 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%2Fx1unjiai46hu83ukide7.jpg" alt=" " width="800" height="899"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A bug worth admitting.&lt;/strong&gt; If you named a sound &lt;em&gt;before&lt;/em&gt; its analysis finished, the name was saved but never became an exemplar: it looked taught and was not. The fix attaches the stored name to the embedding when inference completes, exactly once, and the interface says "memory has not changed yet" until that is true. A real-CLAP test reaches the same similarity (0.837) whether you teach before or after.&lt;/li&gt;
&lt;/ul&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%2Fbwzows5t5vyf4udkt4w6.jpg" 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%2Fbwzows5t5vyf4udkt4w6.jpg" alt=" " width="800" height="771"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The part that composes: no music model.&lt;/strong&gt; An offline NumPy/SciPy renderer cuts motifs out of your recordings, works out which are pitched or percussive, builds phrases and sections, and lets one source answer another. Every event in the output traces back to a window of one of your recordings; the piece in the video has 47 of them.&lt;/li&gt;
&lt;/ul&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%2Fkfpz5xxnne03ff76ad0b.jpg" 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%2Fkfpz5xxnne03ff76ad0b.jpg" alt=" " width="800" height="908"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The part that speaks: Gemma, on a leash
&lt;/h3&gt;

&lt;p&gt;ECHO-0's voice is a local &lt;strong&gt;&lt;code&gt;gemma3:4b&lt;/code&gt;&lt;/strong&gt; through Ollama (4.3B parameters, Q4_K_M). We did not want a chatbot bolted onto a game. Gemma has three narrow jobs: &lt;strong&gt;interpret memory changes&lt;/strong&gt;, &lt;strong&gt;reason about missions&lt;/strong&gt;, and &lt;strong&gt;comment on a composition&lt;/strong&gt;. The backend finds real gaps in your sound memory, and Gemma can only choose among them and word them. It cannot invent one, and it cannot decide whether you completed it. Plain code does that.&lt;/p&gt;

&lt;p&gt;Gemma never sees ids, audio or your notes. It sees short fact lines and must answer in a JSON schema, citing the facts it used. Then a deliberately suspicious validator checks the answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every number must appear in a cited fact,&lt;/li&gt;
&lt;li&gt;every quoted name must be one the player gave,&lt;/li&gt;
&lt;li&gt;no sound source may be mentioned that is not in the evidence,&lt;/li&gt;
&lt;li&gt;no claim of having seen, visited or been retrained,&lt;/li&gt;
&lt;li&gt;no markup, no ids.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If anything fails, a deterministic template says the line instead and the reason is recorded. The game shows the template line first and swaps in Gemma's when it arrives, so nothing ever waits on the model.&lt;/p&gt;

&lt;p&gt;The numbers, stated exactly. Over 19 moments of a real journey, three seeds each (57 calls), &lt;strong&gt;84.2% of Gemma's first attempts passed the validator&lt;/strong&gt; (48 of 57), and the figure reproduced on a second run. Median warm latency is about 1.3 seconds. One rejection class was our own bug: the validator read the apostrophe in "the ears' strongest guess" as an opening quote, and fixing it moved the rate from 71.9% to 84.2%. We also tried telling the model not to write internal handles like "F1", and it wrote &lt;em&gt;more&lt;/em&gt; of them, so we reverted.&lt;/p&gt;

&lt;p&gt;What we have &lt;strong&gt;not&lt;/strong&gt; measured: the end-to-end fallback rate after the single retry, and whether people prefer Gemma's lines to the templates. We built a blind rating sheet for that. Nobody has filled it in yet, so we make no claim that Gemma's wording is better. In the final demo run Gemma was called twice and one answer was rejected, which is far too few calls to call a rate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Current limitations and validation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Human review is missing.&lt;/strong&gt; The musical quality has not been rated by people. Automatic checks say the refined composer fixes measurable problems such as repeated bars; they do not say it is beautiful. A blind listening page is ready.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Novelty detection is a heuristic.&lt;/strong&gt; CLAP's top guess for a quiet or mixed sound is often wrong. That is the point of the game, and why it asks you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generated sounds are easier than real ones.&lt;/strong&gt; Variants from one generator are more alike than real field recordings, so the demo shows the mechanism, not field performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recording can stop when a phone locks.&lt;/strong&gt; We did not claim background capture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests:&lt;/strong&gt; 283 backend tests and 78 frontend tests pass, plus gated real-CLAP and real-Gemma tests.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your recordings never leave your machine.&lt;/strong&gt; A sound from your kitchen or your street is exactly what you do not want on someone else's server. CLAP, the memory, the composer and Gemma all run locally. The phone only captures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We could put a leash on the model.&lt;/strong&gt; Because Gemma runs locally behind Ollama, we could force a JSON schema, measure its failures honestly and put a validator between it and the player. That is why we know the number is 84.2% and not "it seemed fine."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parts are swappable.&lt;/strong&gt; The narrator is a setting. The listening model sits behind a small interface and can be replaced without touching the game.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run&lt;/strong&gt; once the weights are downloaded.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Our Agent Session
&lt;/h2&gt;

&lt;p&gt;We built this with AI coding assistants, so the post is disclosed as AI-assisted: Claude Code for the backend, narrative engine, release engineering and the video tooling, and Codex for the interface.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No public DevRelay agent-session link is included in this draft.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;We are entering three: &lt;strong&gt;Overall&lt;/strong&gt;, &lt;strong&gt;Best Use of Gemma&lt;/strong&gt; and &lt;strong&gt;Best Use of ElevenLabs&lt;/strong&gt;. Here is exactly what each one did in this project, including where it stops.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;Gemma is ECHO-0's voice. Not a chatbot, not a skin over a template: a &lt;strong&gt;local &lt;code&gt;gemma3:4b&lt;/code&gt;&lt;/strong&gt; (4.3B parameters, Q4_K_M) that runs through Ollama on a 15 GB laptop, and whose job is to turn what &lt;em&gt;actually happened&lt;/em&gt; into words.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three narrow jobs, each testable on its own:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interpret memory.&lt;/strong&gt; You taught a sound a name, or corrected the ears. Gemma is handed a few fact lines and says what that means in one or two sentences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reason about missions.&lt;/strong&gt; The backend finds real gaps in your sound memory: a name with one example, a sound nobody could name, nothing pitched yet. Gemma picks among them and words them. It cannot invent a mission, and it cannot decide whether you completed one. Plain code does that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comment on the composition.&lt;/strong&gt; Using the real source roles and the real plan of the piece it just rendered.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How it is kept honest.&lt;/strong&gt; Gemma never sees ids, audio, or your notes. Every fact reaches it as a short line with a handle (&lt;code&gt;F1&lt;/code&gt;, &lt;code&gt;F2&lt;/code&gt;…), and it must answer in a &lt;strong&gt;JSON schema&lt;/strong&gt;, citing the facts it used. Then a deliberately suspicious validator reads the answer before the player does. Every number must appear in a cited fact. Every quoted name must be one you gave. No sound source may be mentioned that the evidence does not contain. No "I walked outside," no "I was retrained," no markup, no ids. If a single check fails, a &lt;strong&gt;deterministic template says the line instead&lt;/strong&gt;, and the reason (&lt;code&gt;invalid_json&lt;/code&gt;, for instance) is recorded next to it. Open the "What this voice is grounded in" panel and you can see which facts any line was built from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we measured, and what we did not.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Moments evaluated&lt;/td&gt;
&lt;td&gt;19 moments of a real journey, 3 seeds each, 57 calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First attempts that passed the validator&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;84.2%&lt;/strong&gt; (48 of 57), reproduced on a second run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output that matched the schema&lt;/td&gt;
&lt;td&gt;100%, through constrained decoding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invented ids&lt;/td&gt;
&lt;td&gt;0, because the model cannot emit ids&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warm latency&lt;/td&gt;
&lt;td&gt;median ≈ 1.3 s, p95 ≈ 1.9 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things we are glad we found. One rejection class was &lt;strong&gt;our own bug&lt;/strong&gt;: the validator read the apostrophe in "the ears' strongest guess" as an opening quote, and fixing it moved the rate from 71.9% to 84.2%. And when we tried to &lt;em&gt;tell&lt;/em&gt; the model not to write handles like &lt;code&gt;F1&lt;/code&gt; into prose, it wrote more of them, so we reverted the instruction. The honest fix was a validator, not a plea.&lt;/p&gt;

&lt;p&gt;The game shows its template line first and swaps in Gemma's when it arrives, so nothing ever waits on the model, and if Gemma is unavailable the game plays on with the templates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we do not claim.&lt;/strong&gt; We did not measure the end-to-end fallback rate after the single retry, and in the final demo run Gemma was called only twice (one answer valid, one rejected as &lt;code&gt;invalid_json&lt;/code&gt;), far too few calls to be a rate. A blind rating sheet that compares Gemma's wording with the templates exists, but nobody has filled it in, so we do &lt;strong&gt;not&lt;/strong&gt; claim Gemma is better than the templates. Gemma was &lt;strong&gt;not fine-tuned&lt;/strong&gt;, it does not hear audio (CLAP does), and it owns no game state. Open weights mattered here for one concrete reason: running it ourselves is what let us force the schema, measure its failures, and put a validator in front of the player.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of ElevenLabs
&lt;/h3&gt;

&lt;p&gt;ElevenLabs is why the demo has sound at all, and we want to be exact about where it sits: &lt;strong&gt;it is demo tooling, not part of the running game.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Sound Effects API generated the demo sounds.&lt;/strong&gt; We could not publish the research audio we tested with, because it is licensed for non-commercial use. So a committed script, &lt;code&gt;scripts/m8_elevenlabs_sounds.py&lt;/code&gt;, asks the Sound Effects API (&lt;code&gt;eleven_text_to_sound_v2&lt;/code&gt;) for &lt;strong&gt;21 clips&lt;/strong&gt;: six that drive the full journey (rain in a metal roof gutter, tolling bells, three takes each) and a fifteen-clip pack of wind, footsteps, birds, water and machines. Each is a ten-second text prompt with no music. The script reads the API key from the environment only, converts each clip to 48 kHz mono, levels it so it clears the app's own ingest checks, and writes a manifest with the prompt, model, settings and checksum of every clip. The audio is not committed, but anyone with their own key can regenerate the set.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then the game does what it does with real recordings.&lt;/strong&gt; CLAP hears the generated sounds, a name we teach becomes retrieval memory, and the Composed orchestra in the video is built only from those clips.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A voice narrates the 50-second video.&lt;/strong&gt; The narrator is the CRITIC voice from our earlier project, ECHOLALIA, generated with ElevenLabs text-to-speech, seven lines mixed under the app's own music.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The sounds, the narration and the music in the demo are generated or composed, not field recordings, and the video says so on screen. We would rather you trust the project than be impressed by a fake hike.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Team submission — built and designed by İclal Doğan (&lt;a href="https://dev.to/iclaldogan"&gt;@iclaldogan&lt;/a&gt;) and Melike Zaman (&lt;a class="mentioned-user" href="https://dev.to/melike_nesrinzaman_713c0"&gt;@melike_nesrinzaman_713c0&lt;/a&gt;). Melike wrote the audio ingestion, the hearing and memory layer and the first versions of the acoustic atlas; İclal built the narrative engine, the composer integration, the release engineering and the demo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Go outside. Listen closely. And if ECHO-0 asks what you heard, tell it the truth.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>THRASH: I Gave My Friend an Operating System for Her Brain</title>
      <dc:creator>İclal Doğan</dc:creator>
      <pubDate>Mon, 05 Oct 2026 01:01:13 +0000</pubDate>
      <link>https://dev.to/iclaldogan/thrash-i-gave-my-friend-an-operating-system-for-her-brain-c1m</link>
      <guid>https://dev.to/iclaldogan/thrash-i-gave-my-friend-an-operating-system-for-her-brain-c1m</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;p&gt;I gave my friend an operating system for her brain.&lt;/p&gt;

&lt;p&gt;Okay, not the &lt;strong&gt;whole operating system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mostly the scheduler.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because apparently that was the missing part.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Somewhere around 3 AM, this became a perfectly reasonable sentence.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;:D&lt;/p&gt;

&lt;p&gt;My friend M. has a problem.&lt;/p&gt;

&lt;p&gt;Not the usual productivity problem.&lt;/p&gt;

&lt;p&gt;She does not procrastinate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That is almost the problem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For privacy, I'll call her M.&lt;/p&gt;

&lt;p&gt;M. is the kind of person who seems to have an unreasonable number of processes running in her head at the same time.&lt;/p&gt;

&lt;p&gt;One has music playing.&lt;/p&gt;

&lt;p&gt;One has an unfinished math problem.&lt;/p&gt;

&lt;p&gt;One contains a game she is building.&lt;/p&gt;

&lt;p&gt;Two more are research ideas that absolutely did not exist yesterday.&lt;/p&gt;

&lt;p&gt;There is probably a half-written article somewhere underneath them.&lt;/p&gt;

&lt;p&gt;And occasionally a completely unrelated question appears, gets promoted to critical priority, and steals the CPU.&lt;/p&gt;

&lt;p&gt;Her brain looks like a desktop nobody has restarted since 2019.&lt;/p&gt;

&lt;p&gt;There are four terminals open.&lt;/p&gt;

&lt;p&gt;Nobody knows what terminal number three is doing.&lt;/p&gt;

&lt;p&gt;Including M.&lt;/p&gt;

&lt;p&gt;My first thought was obvious:&lt;/p&gt;

&lt;p&gt;I should build her a planner.&lt;/p&gt;

&lt;p&gt;Then I realized that giving her another planner would probably just create another thing she had to manage.&lt;/p&gt;

&lt;p&gt;So I stopped thinking about M. as an unorganized person.&lt;/p&gt;

&lt;p&gt;And started thinking about her as a badly scheduled computer.&lt;/p&gt;

&lt;p&gt;Then something clicked.&lt;/p&gt;

&lt;p&gt;I had seen this failure before.&lt;/p&gt;

&lt;p&gt;Not in a person.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Operating Systems class.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a computer keeps too many working sets active and spends more time moving context in and out than doing useful work, it starts &lt;strong&gt;thrashing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;M. was doing the human version.&lt;/p&gt;

&lt;p&gt;So I did the only reasonable thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I gave my friend a kernel.&lt;/strong&gt;&lt;/p&gt;




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

&lt;p&gt;THRASH is a local AI-powered &lt;strong&gt;human process scheduler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It treats projects the way an operating system treats processes.&lt;/p&gt;

&lt;p&gt;Not because I wanted to rename todo-list concepts with OS vocabulary.&lt;/p&gt;

&lt;p&gt;The rule I used throughout development was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If an operating-system metaphor does not correspond to real behavior, it does not belong in THRASH.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Projects can be &lt;code&gt;RUNNING&lt;/code&gt;, &lt;code&gt;READY&lt;/code&gt;, &lt;code&gt;SLEEPING&lt;/code&gt;, &lt;code&gt;STARVED&lt;/code&gt;, &lt;code&gt;ZOMBIE&lt;/code&gt;, or deliberately terminated.&lt;/p&gt;

&lt;p&gt;Switching projects saves context.&lt;/p&gt;

&lt;p&gt;Returning to an old project restores it.&lt;/p&gt;

&lt;p&gt;Ideas can arrive as interrupts instead of immediately creating another project.&lt;/p&gt;

&lt;p&gt;Neglected work can starve.&lt;/p&gt;

&lt;p&gt;Projects that quietly died while leaving TODOs and unresolved decisions behind can become zombies.&lt;/p&gt;

&lt;p&gt;Too many active working sets create memory pressure.&lt;/p&gt;

&lt;p&gt;Too many rapid switches create thrashing.&lt;/p&gt;

&lt;p&gt;And eventually:&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%2F85y11qbczt73nzec4jbx.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%2F85y11qbczt73nzec4jbx.png" alt=" " width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But the most important feature is not the joke.&lt;/p&gt;

&lt;p&gt;It is what happens when M. returns to a project after hours, days, or weeks away.&lt;/p&gt;

&lt;h3&gt;
  
  
  A human PAGE FAULT
&lt;/h3&gt;

&lt;p&gt;A computer can suspend a process and preserve enough state to resume execution later.&lt;/p&gt;

&lt;p&gt;Humans usually don't.&lt;/p&gt;

&lt;p&gt;We close the editor.&lt;/p&gt;

&lt;p&gt;We open something else.&lt;/p&gt;

&lt;p&gt;We come back three days later.&lt;/p&gt;

&lt;p&gt;And stare at our own files like somebody else wrote them.&lt;/p&gt;

&lt;p&gt;THRASH creates a semantic &lt;strong&gt;process image&lt;/strong&gt; before that context disappears.&lt;/p&gt;

&lt;p&gt;When M. returns, THRASH resolves a human &lt;code&gt;PAGE FAULT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It does not just say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You were working on &lt;code&gt;game-alpha&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It tries to reconstruct:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what she actually did,&lt;/li&gt;
&lt;li&gt;what she finished,&lt;/li&gt;
&lt;li&gt;what she deliberately decided,&lt;/li&gt;
&lt;li&gt;why she made that decision,&lt;/li&gt;
&lt;li&gt;where she stopped,&lt;/li&gt;
&lt;li&gt;what remains unresolved,&lt;/li&gt;
&lt;li&gt;what changed while she was gone,&lt;/li&gt;
&lt;li&gt;and what the next executable step should be.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A restoration can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PAGE FAULT

YOU WERE HERE

Built the camera prototype and checked idle poses.
Turn testing is unfinished.

YOU DECIDED

Validate the rig before engine integration.

why:
Avoid rebuilding an untested rig.

YOU STOPPED AT

Testing the 45-degree turn pose.

WHILE YOU WERE GONE

1 relevant file changed.

STILL OPEN

Does the shoulder deform during a turn?

BLOCKER

Turn pose has not been validated.

NEXT EXECUTION

Open notes.md and test the rig at a 45-degree turn
before engine integration.

FAULT RESOLVED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is the part of THRASH I actually wanted M. to have.&lt;/p&gt;

&lt;p&gt;She does not really need software telling her to "be productive."&lt;/p&gt;

&lt;p&gt;She needs something that can answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What on earth was I doing here?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;before she spends twenty minutes rebuilding the entire project inside her head.&lt;/p&gt;


&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;
&lt;h3&gt;
  
  
  PAGE FAULT — restoring the person who left
&lt;/h3&gt;



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

&lt;p&gt;The project context is restored as a process image.&lt;/p&gt;

&lt;p&gt;The program counter becomes the point where M. stopped.&lt;/p&gt;

&lt;p&gt;Decisions become preserved state.&lt;/p&gt;

&lt;p&gt;Unresolved questions survive the switch.&lt;/p&gt;

&lt;p&gt;The next action becomes the next instruction.&lt;/p&gt;

&lt;p&gt;The theatrical part is intentional.&lt;/p&gt;

&lt;p&gt;But the state underneath it is real.&lt;/p&gt;


&lt;h3&gt;
  
  
  IRQ — an idea does not have to become a project
&lt;/h3&gt;

&lt;p&gt;M. has another problem.&lt;/p&gt;

&lt;p&gt;She has ideas.&lt;/p&gt;

&lt;p&gt;A lot of them.&lt;/p&gt;

&lt;p&gt;Previously, an interesting thought had a fairly dangerous execution path:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interesting thought
        ↓
browser tab
        ↓
notes
        ↓
research
        ↓
new folder
        ↓
new project
        ↓
what was I doing before this?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;THRASH gives that thought somewhere else to go.&lt;/p&gt;

&lt;p&gt;It can arrive as an interrupt.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flbbgm4vk4vpw28hyz6pm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flbbgm4vk4vpw28hyz6pm.gif" alt=" " width="800" height="549"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IRQ RECEIVED

current execution preserved
interrupt queued
execution resumed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The idea is not lost.&lt;/p&gt;

&lt;p&gt;But it also does not automatically deserve an entire process.&lt;/p&gt;

&lt;p&gt;That turned out to be one of my favorite parts of the project.&lt;/p&gt;


&lt;h3&gt;
  
  
  When the scheduler actually starts thrashing
&lt;/h3&gt;



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

&lt;p&gt;The interface does not glitch randomly for terminal aesthetics.&lt;/p&gt;

&lt;p&gt;Visual instability is tied to scheduler pressure.&lt;/p&gt;

&lt;p&gt;High switch frequency creates dispatch echoes.&lt;/p&gt;

&lt;p&gt;Stale process images leave residue.&lt;/p&gt;

&lt;p&gt;Working-set pressure creates page churn.&lt;/p&gt;

&lt;p&gt;Interrupts accumulate on the IRQ rail.&lt;/p&gt;

&lt;p&gt;The dispatch trace becomes harder to maintain because the underlying human schedule is becoming harder to maintain.&lt;/p&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The screen isn't glitching because I wanted a cool terminal aesthetic.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's glitching because she keeps switching projects.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction mattered a lot to me.&lt;/p&gt;

&lt;p&gt;I did not want THRASH to look like an operating system.&lt;/p&gt;

&lt;p&gt;I wanted it to &lt;strong&gt;behave like one&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Paging something out
&lt;/h3&gt;

&lt;p&gt;Sometimes the correct answer is not to delete a project.&lt;/p&gt;

&lt;p&gt;It is simply:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;not now.&lt;/strong&gt;&lt;/p&gt;



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

&lt;p&gt;Suspending a process saves its working state and moves it across the &lt;code&gt;SWAP HORIZON&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pressure drops.&lt;/p&gt;

&lt;p&gt;The scope stabilizes.&lt;/p&gt;

&lt;p&gt;The project is not gone.&lt;/p&gt;

&lt;p&gt;Its context is waiting.&lt;/p&gt;


&lt;h3&gt;
  
  
  The Human Kernel Scope
&lt;/h3&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%2F2wi388akiwfc5htpudl1.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%2F2wi388akiwfc5htpudl1.png" alt=" " width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The interface is built around THRASH-specific primitives:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DISPATCH TRACE
SCHEDULER SCAR
RESIDENT WORKING SET
SWAP HORIZON
CORE / PROGRAM COUNTER / REGISTERS / STACK
IRQ RAIL
PAGE FAULT
KERNEL PANIC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The historical &lt;code&gt;SCAR&lt;/code&gt; shows old scheduling behavior faintly behind the current dispatch trace.&lt;/p&gt;

&lt;p&gt;The working-set map shows which project contexts remain resident.&lt;/p&gt;

&lt;p&gt;The core shows exactly one running process.&lt;/p&gt;

&lt;p&gt;Because M. may have many projects.&lt;/p&gt;

&lt;p&gt;But she still has one human core.&lt;/p&gt;

&lt;p&gt;If you want to see the scar itself more clearly:&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%2F3ev9bzb1qh7n5y5gcbrh.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%2F3ev9bzb1qh7n5y5gcbrh.png" alt=" " width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;


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

&lt;p&gt;The project is open source here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/miclaldogan/thrash" rel="noopener noreferrer"&gt;github.com/miclaldogan/thrash&lt;/a&gt;&lt;/p&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/miclaldogan" rel="noopener noreferrer"&gt;
        miclaldogan
      &lt;/a&gt; / &lt;a href="https://github.com/miclaldogan/thrash" rel="noopener noreferrer"&gt;
        thrash
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A local AI human-process scheduler for people with too many projects in memory.
    &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;THRASH&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;She didn’t need another planner. She needed a kernel.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;THRASH is a local human-process scheduler for returning to unfinished projects. PAGE FAULT restores what finished, what you decided and why, where you stopped, what changed, and the next action. Open-weight Gemma reconstructs that meaning locally from files and commits; Python measures switching and pressure. THRASH saves execution context across switches rather than organizing a task list. Project contents stay on your machine.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/miclaldogan/thrash/docs/media/page-fault.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmiclaldogan%2Fthrash%2FHEAD%2Fdocs%2Fmedia%2Fpage-fault.gif" alt="PAGE FAULT: returning to the exact stopping point"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;1 human. 1 core. Too many processes.&lt;/code&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The human bug&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;My friend has more processes than cores.&lt;/p&gt;

&lt;p&gt;She doesn't procrastinate. That's the annoying part. She is always doing something.&lt;/p&gt;

&lt;p&gt;I considered building her a planner. She already has three. One of them contains a task called “organize task manager.” So that seemed unwise.&lt;/p&gt;

&lt;p&gt;Then I realized I'd seen this failure before. Not in a person. In Operating Systems class.&lt;/p&gt;

&lt;p&gt;She didn't need another planner. She needed a…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/miclaldogan/thrash" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;THRASH is a terminal-native Python application.&lt;/p&gt;

&lt;p&gt;The kernel logic is deliberately separate from the interface.&lt;/p&gt;

&lt;p&gt;The TUI is a client of the scheduler rather than the owner of its state.&lt;/p&gt;

&lt;p&gt;That mattered because I wanted commands, tests, demos, and the full-screen Human Kernel Scope to operate on the same underlying process model.&lt;/p&gt;

&lt;p&gt;At the time of this submission, THRASH has &lt;strong&gt;159 passing tests&lt;/strong&gt; covering the scheduler, restoration behavior, privacy boundaries, model failure handling, interrupts, starvation, zombie detection, Sentry filtering, evaluation behavior, and the visual state model.&lt;/p&gt;

&lt;p&gt;Public demos use simulated project histories and anonymized aliases such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;game-alpha
paper-crane
vision-lab
circuit-garden
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;THRASH was also verified locally against real projects in read-only mode.&lt;/p&gt;

&lt;p&gt;Those contents were never committed and never used in public screenshots or fixtures.&lt;/p&gt;




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

&lt;p&gt;THRASH has two intentionally different halves.&lt;/p&gt;

&lt;h3&gt;
  
  
  The scheduler is deterministic
&lt;/h3&gt;

&lt;p&gt;Python handles everything that does not need a language model.&lt;/p&gt;

&lt;p&gt;That includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;process registration,&lt;/li&gt;
&lt;li&gt;context-switch history,&lt;/li&gt;
&lt;li&gt;active/sleeping states,&lt;/li&gt;
&lt;li&gt;working-set pressure,&lt;/li&gt;
&lt;li&gt;starvation,&lt;/li&gt;
&lt;li&gt;zombie heuristics,&lt;/li&gt;
&lt;li&gt;snapshot age,&lt;/li&gt;
&lt;li&gt;interrupts,&lt;/li&gt;
&lt;li&gt;swap state,&lt;/li&gt;
&lt;li&gt;thrashing thresholds,&lt;/li&gt;
&lt;li&gt;drift timestamps,&lt;/li&gt;
&lt;li&gt;and scheduler telemetry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I did not want an LLM deciding whether eleven context switches are more than four context switches.&lt;/p&gt;

&lt;p&gt;That is code's job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemma reconstructs the human part
&lt;/h3&gt;

&lt;p&gt;The harder question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which files changed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Git already knows that.&lt;/p&gt;

&lt;p&gt;The difficult question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What did the human think she was doing when she left?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;THRASH runs a local &lt;strong&gt;Gemma&lt;/strong&gt; model through &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Gemma receives privacy-filtered project evidence and reconstructs a structured semantic process image.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;local project evidence
        ↓
privacy filter
        ↓
Gemma
        ↓
semantic process image
        ↓
program counter
decisions
completed work
unresolved state
blockers
relevant files
next execution
        ↓
PAGE FAULT resolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model is asked for structured output.&lt;/p&gt;

&lt;p&gt;That output is validated before THRASH accepts it.&lt;/p&gt;

&lt;p&gt;Unsupported or malformed model responses are rejected rather than silently becoming project history.&lt;/p&gt;

&lt;p&gt;And this distinction became important during evaluation.&lt;/p&gt;

&lt;p&gt;I learned very quickly that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Valid JSON is not the same thing as valid memory.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My first evaluation looked superficially fine.&lt;/p&gt;

&lt;p&gt;All eight scenarios produced valid schemas.&lt;/p&gt;

&lt;p&gt;But recorded decision extraction was:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0/7.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The JSON was valid.&lt;/p&gt;

&lt;p&gt;The memory wasn't.&lt;/p&gt;

&lt;p&gt;So I investigated instead of hiding the result.&lt;/p&gt;

&lt;p&gt;The evidence was still present after retrieval.&lt;/p&gt;

&lt;p&gt;The privacy filter had not removed it.&lt;/p&gt;

&lt;p&gt;The real problem was that my definition of a "decision" was too vague.&lt;/p&gt;

&lt;p&gt;I tightened the extraction contract:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A decision must be an explicitly recorded choice, constraint, rejection, approval, or intentional deferral.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A task is not a decision.&lt;/p&gt;

&lt;p&gt;A current state is not a decision.&lt;/p&gt;

&lt;p&gt;An inferred preference is not automatically a recorded decision.&lt;/p&gt;

&lt;p&gt;Then I reran the &lt;strong&gt;same evaluation scenarios with the same scoring rules&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The release revision produced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;8/8&lt;/strong&gt; valid schemas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8/8&lt;/strong&gt; completed-work coverage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8/8&lt;/strong&gt; next-action coverage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7/7&lt;/strong&gt; recorded decisions extracted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6/6&lt;/strong&gt; recorded decision reasons preserved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7/8&lt;/strong&gt; task-keyword coverage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2 unsupported assertions&lt;/strong&gt; still detected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The one task-keyword miss was a faithful paraphrase, so I left the grader unchanged rather than making the metric prettier.&lt;/p&gt;

&lt;p&gt;And the two unsupported assertions are still documented.&lt;/p&gt;

&lt;p&gt;Because this is memory software.&lt;/p&gt;

&lt;p&gt;Pretending that an LLM is infallible here would be a much worse design decision than admitting where it still fails.&lt;/p&gt;

&lt;p&gt;The scheduler is ordinary Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The part that remembers why M. was there is Gemma.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Why the process image matters
&lt;/h3&gt;

&lt;p&gt;A saved process image contains concepts such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PROGRAM COUNTER
the immediate execution point

REGISTERS
important project state and constraints

STACK
the chain of work around the current task

OPEN HANDLES
currently relevant project files

DECISIONS
explicit choices and their evidence

UNRESOLVED
questions that survived the context switch

NEXT EXECUTION
the smallest useful action for re-entry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The OS vocabulary is not there just for style.&lt;/p&gt;

&lt;p&gt;It gave me a surprisingly useful way to ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is the minimum state a human needs in order to resume this project without reconstructing everything from scratch?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question became the center of THRASH.&lt;/p&gt;




&lt;h3&gt;
  
  
  Sentry traces THRASH
&lt;/h3&gt;

&lt;p&gt;There is a slightly ridiculous recursive part to this project.&lt;/p&gt;

&lt;p&gt;THRASH traces M.'s context switches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sentry traces THRASH's.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sentry support is optional and disabled by default.&lt;/p&gt;

&lt;p&gt;Normal THRASH operation does not require Sentry or an internet connection.&lt;/p&gt;

&lt;p&gt;For a fresh PAGE FAULT, THRASH instruments the restoration pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;thrash.page_fault
├── thrash.process_image.load
├── thrash.context.collect
├── thrash.privacy.filter
├── thrash.gemma.resume
├── thrash.schema.validate
├── thrash.drift.detect
└── thrash.restore.render
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F9dzbzbxdqchw0q5y6u49.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%2F9dzbzbxdqchw0q5y6u49.png" alt=" " width="799" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The trace exposed the bottleneck immediately.&lt;/p&gt;

&lt;p&gt;One measured cold restoration took about &lt;strong&gt;80.4 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Almost all of that time was local Gemma inference.&lt;/p&gt;

&lt;p&gt;Roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gemma resume      ~80.315 s
context collect    ~6.5 ms
privacy filter     ~2.3 ms
schema validate    &amp;lt;1 ms
render             &amp;lt;1 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returning to an already saved process image was dramatically cheaper.&lt;/p&gt;

&lt;p&gt;Milliseconds instead of another full inference.&lt;/p&gt;

&lt;p&gt;That cold-start latency is a real limitation of the current local setup.&lt;/p&gt;

&lt;p&gt;I would rather document it than pretend the machine suddenly became a datacenter because I like my terminal UI.&lt;/p&gt;

&lt;p&gt;For this submission, I verified the Sentry SDK envelopes locally.&lt;/p&gt;

&lt;p&gt;I did &lt;strong&gt;not&lt;/strong&gt; have DSN/project access available for hosted Sentry verification.&lt;/p&gt;

&lt;p&gt;So I am not presenting a fake hosted dashboard screenshot.&lt;/p&gt;

&lt;p&gt;And I am not claiming that I performed one.&lt;/p&gt;

&lt;p&gt;The integration itself is deliberately metadata-only.&lt;/p&gt;

&lt;p&gt;Sentry receives:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No prompts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No completions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No source code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No note contents.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No Git diffs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No commit messages.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No absolute project paths.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No IRQ text.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No real project identities.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only sanitized operational metadata such as duration, validation state, item counts, model timing, and scheduler state.&lt;/p&gt;

&lt;p&gt;Observability should not destroy the privacy model it is supposed to observe.&lt;/p&gt;




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

&lt;p&gt;THRASH would feel fundamentally wrong if helping M. remember her projects required uploading those projects to somebody else's server.&lt;/p&gt;

&lt;p&gt;The information needed for a useful PAGE FAULT may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unfinished source code,&lt;/li&gt;
&lt;li&gt;research notes,&lt;/li&gt;
&lt;li&gt;unreleased experiments,&lt;/li&gt;
&lt;li&gt;abandoned ideas,&lt;/li&gt;
&lt;li&gt;TODO files,&lt;/li&gt;
&lt;li&gt;architectural decisions,&lt;/li&gt;
&lt;li&gt;and thoughts that were never intended to become public.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are exactly the things THRASH needs to understand.&lt;/p&gt;

&lt;p&gt;And exactly the things I do not want leaving the laptop.&lt;/p&gt;

&lt;p&gt;Gemma runs locally through Ollama.&lt;/p&gt;

&lt;p&gt;Inference can happen without a cloud API.&lt;/p&gt;

&lt;p&gt;The model can be swapped.&lt;/p&gt;

&lt;p&gt;The extraction prompts can be inspected and changed.&lt;/p&gt;

&lt;p&gt;The behavior can be tested.&lt;/p&gt;

&lt;p&gt;There is no per-call cost forcing me to reduce the weirdness of the idea into the shape of somebody else's hosted product.&lt;/p&gt;

&lt;p&gt;And if the internet disappears:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the human kernel still works.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That matters because privacy is not an extra feature in THRASH.&lt;/p&gt;

&lt;p&gt;It is part of the architecture.&lt;/p&gt;

&lt;p&gt;The project maintains explicit privacy boundaries and regression tests for things such as secret-like text, symlink escapes, excluded directories, absolute path leakage, malformed model output, and observability metadata.&lt;/p&gt;

&lt;p&gt;Open-weight AI let me build the system around M.'s projects without requiring M.'s projects to leave her machine.&lt;/p&gt;




&lt;p&gt;There is also a creative reason open models mattered.&lt;/p&gt;

&lt;p&gt;THRASH is a strange use of an LLM.&lt;/p&gt;

&lt;p&gt;I am asking a language model to help represent human project context as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a program counter
registers
a stack
open handles
decisions
interrupts
process images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wanted to be able to keep changing that representation.&lt;/p&gt;

&lt;p&gt;To experiment.&lt;/p&gt;

&lt;p&gt;To make it slightly weird.&lt;/p&gt;

&lt;p&gt;To run it locally.&lt;/p&gt;

&lt;p&gt;To break it.&lt;/p&gt;

&lt;p&gt;To inspect why it failed.&lt;/p&gt;

&lt;p&gt;And to keep going without asking permission from a hosted interface.&lt;/p&gt;

&lt;p&gt;The strange part of THRASH is allowed to remain strange.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;THRASH was built heavily with a local coding agent.&lt;/p&gt;

&lt;p&gt;I did not record the weekend build through DevRelay, so I do not have a DevRelay session to embed here.&lt;/p&gt;

&lt;p&gt;The incremental development history is preserved in the Git repository instead:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/miclaldogan/thrash/commits/main/" rel="noopener noreferrer"&gt;THRASH commit history&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is something appropriately recursive about using an agent to build a scheduler for a human whose scheduler was apparently missing.&lt;/p&gt;

&lt;p&gt;During development, THRASH itself repeatedly tried to become exactly the problem it was supposed to solve.&lt;/p&gt;

&lt;p&gt;More ideas.&lt;/p&gt;

&lt;p&gt;More mechanics.&lt;/p&gt;

&lt;p&gt;More visual systems.&lt;/p&gt;

&lt;p&gt;More things to add.&lt;/p&gt;

&lt;p&gt;Eventually I had to give the coding agent one very specific instruction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;No more features.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We are now scheduling the scheduler.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wish that sentence were a joke.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;Gemma is not a chatbot attached to THRASH.&lt;/p&gt;

&lt;p&gt;There is no generic "ask my repository" interface.&lt;/p&gt;

&lt;p&gt;The deterministic kernel can measure context switches, snapshot age, Git changes, active working sets, starvation, and scheduler pressure.&lt;/p&gt;

&lt;p&gt;What it cannot understand is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why was the human here?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gemma reconstructs the semantic process state that makes PAGE FAULT restoration useful.&lt;/p&gt;

&lt;p&gt;Remove Gemma and THRASH can still count context switches.&lt;/p&gt;

&lt;p&gt;It can no longer reconstruct the human state behind them.&lt;/p&gt;

&lt;p&gt;That is why Gemma sits at the center of the restoration path rather than at the edge of the interface.&lt;/p&gt;




&lt;h3&gt;
  
  
  Best Use of Sentry Agent Tracing
&lt;/h3&gt;

&lt;p&gt;Sentry is used to observe the semantic restoration pipeline itself.&lt;/p&gt;

&lt;p&gt;It lets me see where a PAGE FAULT spends time, where model extraction fails, whether schema validation succeeds, and how expensive fresh inference is compared with restoring an existing process image.&lt;/p&gt;

&lt;p&gt;The integration is optional.&lt;/p&gt;

&lt;p&gt;It is metadata-only.&lt;/p&gt;

&lt;p&gt;And normal THRASH behavior remains local-first.&lt;/p&gt;

&lt;p&gt;The short version is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;THRASH watches the human scheduler.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sentry watches THRASH.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  One Last Thing
&lt;/h2&gt;

&lt;p&gt;I built THRASH because M. has more processes than cores.&lt;/p&gt;

&lt;p&gt;But after spending a weekend on it, I do not think the problem is uniquely hers.&lt;/p&gt;

&lt;p&gt;Most productivity software assumes the hard part is deciding what task comes next.&lt;/p&gt;

&lt;p&gt;Sometimes it isn't.&lt;/p&gt;

&lt;p&gt;Sometimes you already know exactly which project you want to continue.&lt;/p&gt;

&lt;p&gt;You open it.&lt;/p&gt;

&lt;p&gt;And realize you no longer remember the person who was working on it.&lt;/p&gt;

&lt;p&gt;What they learned.&lt;/p&gt;

&lt;p&gt;What they rejected.&lt;/p&gt;

&lt;p&gt;What they were worried about.&lt;/p&gt;

&lt;p&gt;Why that TODO exists.&lt;/p&gt;

&lt;p&gt;Why that particular file is open.&lt;/p&gt;

&lt;p&gt;Why they stopped exactly there.&lt;/p&gt;

&lt;p&gt;A computer would never voluntarily switch away from a process without preserving enough state to resume it.&lt;/p&gt;

&lt;p&gt;Humans do it to themselves constantly.&lt;/p&gt;

&lt;p&gt;THRASH does not tell M. to focus.&lt;/p&gt;

&lt;p&gt;It does not tell her to have fewer ideas.&lt;/p&gt;

&lt;p&gt;It does not try to turn curiosity off.&lt;/p&gt;

&lt;p&gt;Frankly, I do not think either of us would enjoy that version of her very much.&lt;/p&gt;

&lt;p&gt;It just gives all those ideas somewhere to wait.&lt;/p&gt;

&lt;p&gt;And gives the projects she returns to a way to remember who left them there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 human.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 core.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Too many processes.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>THE NEXT SHIFT - a hospital night where the money you start with was left by the last player</title>
      <dc:creator>İclal Doğan</dc:creator>
      <pubDate>Sun, 06 Sep 2026 19:27:02 +0000</pubDate>
      <link>https://dev.to/iclaldogan/the-next-shift-a-hospital-night-where-the-money-you-start-with-was-left-by-the-last-player-1kmp</link>
      <guid>https://dev.to/iclaldogan/the-next-shift-a-hospital-night-where-the-money-you-start-with-was-left-by-the-last-player-1kmp</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for&lt;/em&gt; &lt;a href="https://dev.to/challenges/weekend-2026-09-03"&gt;&lt;em&gt;Weekend Challenge: Generosity Edition&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;THE NEXT SHIFT is a 16-bit narrative simulation about four hours of night cleaning in a public hospital — and the money you begin with is the only thing in it that isn't fiction.&lt;/p&gt;

&lt;p&gt;You don't earn your opening balance. You find it in locker 14, wrapped in a cleaning cloth, left there by whoever played this game before you, along with 140 characters they recorded on a radio that only receives. At 06:00 you take off the overalls and decide how much of what's left stays on the shelf. That decision is written to a chain, and it is what the next person opens the locker to.&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%2F33l2hz0ez5469gqba718.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%2F33l2hz0ez5469gqba718.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Four people have already worked this shift. Two of them left you something.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;02:00. Corridor B is a swamp and you have a mop.&lt;/p&gt;

&lt;p&gt;The loop is small on purpose: mop the spills the desk radios you about, get paid two or three coins at a time, buy a sandwich from a machine that sometimes eats your coin. Four hours pass in seven minutes of real time. Hunger falls. Fatigue climbs.&lt;/p&gt;

&lt;p&gt;And people arrive. Not all at once — one or two at a time, all night, dealt out of a pool onto the benches and the doorways and the wet fire landing.&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%2Frkkmfgh6bueljngxbsv3.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%2Frkkmfgh6bueljngxbsv3.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Neither of them has asked you for anything. That is the difficulty.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There are six of them and no more, because there are six portraits and I refuse to give one face two names. An old man four coins short of a prescription. An intern who dropped a patient's charts at three in the morning and cannot pick them up. A man outside theatre 2 who has counted the corridor tiles nine times. A head nurse who needs twenty minutes off the floor and someone who didn't see her leave. A man on the fire landing with thirty coins and a request. A cat.&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%2Ft4w060enkbqdnui8env4.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%2Ft4w060enkbqdnui8env4.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;He gets to finish. Nothing is asked of you while he is still talking.&lt;/em&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%2Fic6bh0jvstif1w626z4d.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%2Fic6bh0jvstif1w626z4d.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Eight coins is eight coins. So is three.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every answer costs something you were counting: coins, or minutes off a four-hour clock, or half the sandwich in your pocket. Nobody thanks you at the time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But they come back.&lt;/strong&gt; Help the intern and she is worth almost nothing at the time — four points of mood, a shrug. At four in the morning she finds you in the corridor with a coffee from the doctors' machine, and that is worth fourteen. Buy the man outside theatre 2 something hot at two, and at three he may be sitting on the floor beside the chair telling you it was the bleeding, and that he has been thinking about that coffee for an hour.&lt;/p&gt;

&lt;p&gt;The night does not promise that kindness works. It only promises that it comes back to tell you.&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%2Fw3rdcr3ymfcud3p0en73.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%2Fw3rdcr3ymfcud3p0en73.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Everything on this landing wants something. One of them is a cat.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There is a fourth stat under FED and TIRED, and it is called MOOD. It drains on its own, faster when you're hungry, faster still when you're wrecked — and people move it far more than coffee does. Let it fall and the game says so without a word: the vignette closes in, the colour drains out of the street, the grain lifts. Somewhere under 24 you stop in the middle of the floor and cannot immediately think why you started.&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%2Ffo721a6th363tcgk3hc0.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%2Ffo721a6th363tcgk3hc0.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Nothing has happened. That is somehow the worst version of it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At 06:00 the desk says go home. You walk to locker 14, put the overalls in the bag, and look into a cracked mirror that has watched the whole shift and describes it back to you in three sentences. Then a ledger: one line per person, and what happened to them — a follow-up overwrites the first account, because it's the one that turned out to be true.&lt;/p&gt;

&lt;p&gt;Then the walkie-talkie, and the only real decision in the game.&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%2F7sfmiswoqfy4fzymlny3.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%2F7sfmiswoqfy4fzymlny3.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The game will not do this part for you.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  How it connects to the theme
&lt;/h3&gt;

&lt;p&gt;Generosity is easy to write as a button. The hard part is making it cost, and making it anonymous.&lt;/p&gt;

&lt;p&gt;So the coins are not a score. They are a real balance, sitting in a Memo Program instruction on Solana devnet, and every coin you leave is a coin you don't have. You will never meet the person who gets them. You will never know if they kept them. The only thing you can be sure of is that they will see what you left, and the 140 characters you left with it, before they mop a single tile.&lt;/p&gt;

&lt;p&gt;Every player is somebody's previous shift.&lt;/p&gt;
&lt;h3&gt;
  
  
  A word before you play
&lt;/h3&gt;

&lt;p&gt;Bring headphones — the ambience is doing more work than the graphics.&lt;/p&gt;

&lt;p&gt;It's about seven minutes. Don't rush the locker at the end; that's the part the rest of it is for. And when someone comes back to you at four in the morning, it's because of something you did at two.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Play it: &lt;a href="https://the-next-shift-henna.vercel.app" rel="noopener noreferrer"&gt;https://the-next-shift-henna.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No install, no wallet, no sign-in. About seven minutes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/miclaldogan/the-next-shift" rel="noopener noreferrer"&gt;https://github.com/miclaldogan/the-next-shift&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It runs with no keys at all — silent, on a local ledger, with a hand-written mirror. Every integration degrades instead of breaking, which is the only reason I could keep building at four in the morning when a faucet was dry and a rate limiter had opinions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
cp&lt;/span&gt; .env.example .env.local
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Next.js and TypeScript, one HTML5 canvas at 640×360, and a Python asset pipeline. The systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A ledger that is a linked list, not a receipt.&lt;/strong&gt; Each handover is one transaction: a &lt;code&gt;SystemProgram.transfer&lt;/code&gt; for the coins and a memo carrying &lt;code&gt;{app, shift, leftCoins, msg, prev}&lt;/code&gt;. &lt;code&gt;prev&lt;/code&gt; is the signature of the shift &lt;em&gt;this&lt;/em&gt; player inherited — so the handovers chain, the ordering is provable from the memos instead of trusted from whatever order the RPC returned, and a broken link is detectable. Point one record at the wrong parent and the API says &lt;code&gt;verified: false&lt;/code&gt;. The title screen reads the last four back.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A mirror that has been paying attention.&lt;/strong&gt; At 06:00 Gemini receives what you earned, what you spent on yourself, what you spent on other people, your mood, and a timestamped list of every choice &lt;em&gt;and how each one turned out&lt;/em&gt; — then answers in exactly three sentences, under a response schema, with the last one required to be small and physical. It is not allowed to moralise and it is not allowed to say "kindness".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Three voices, one of them through a radio.&lt;/strong&gt; ElevenLabs speaks the previous player's message, the desk's calls and the mirror. The first two are band-passed to 300–3400 Hz, soft-clipped with &lt;code&gt;tanh&lt;/code&gt; and laid over carrier hiss, so the walkie-talkie sounds like a walkie-talkie. The mirror plays dry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Everything else you hear has no file behind it.&lt;/strong&gt; The fluorescent hum is a 50 Hz sawtooth through a low-pass with a 100 Hz square harmonic on top. The rain is shaped brown noise in two bands. The monitor beeping four rooms away is a sine blip on a four-second timer. There are no audio assets in the repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Six people, dealt over time.&lt;/strong&gt; Stories are entries in one file, gated on flags and delays: &lt;code&gt;needsFlag: "oldman_helped", delayAfterFlag: 75&lt;/code&gt;. The state records &lt;em&gt;when&lt;/em&gt; each flag was raised, so "an hour and a quarter after you paid for his prescription" is expressible as data. Seventeen of the twenty-three entries are callbacks. A person can only be in one place at once.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A validator that refuses my mistakes.&lt;/strong&gt; &lt;code&gt;npm run check:content&lt;/code&gt; rejects a story whose pose has no slot in its scene, a follow-up waiting on a flag no choice ever raises, a doorway that drops you inside another doorway's trigger, a pose more than six stories share one slot for — and one name per sprite, which is the rule I broke worst before I wrote it down.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Four things that only doing it taught me
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Chroma keying is not thresholding.&lt;/strong&gt; The art arrives composited over flat magenta, and the obvious &lt;code&gt;(r&amp;gt;200)&amp;amp;(g&amp;lt;60)&amp;amp;(b&amp;gt;200)&lt;/code&gt; is wrong in a way you only see up close: the artist painted translucent things &lt;em&gt;onto&lt;/em&gt; the magenta — mop water, wet cloth, every anti-aliased edge. My first build had a vivid pink puddle under the mop, because the water was a grey film over the backing and came out at &lt;code&gt;(80,1,73)&lt;/code&gt; — magenta, nowhere near the threshold. The fix is to stop classifying pixels and solve the compositing equation instead. Magenta excess gives fractional alpha; then un-mix the key back off.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;excess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;minimum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;
&lt;span class="n"&gt;alpha&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;excess&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;226.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# 226 = the key's own spread
&lt;/span&gt;&lt;span class="n"&gt;fg&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rgb&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;maximum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That puddle pixel comes out at alpha 0.68 over near-black — a dark wet streak on the floor, which is what it was always meant to be. Residual pink across the atlas went from 0.40 % of opaque pixels to 0.11 %, and the edge-erosion pass I'd written became unnecessary. Fractional alpha &lt;em&gt;is&lt;/em&gt; anti-aliasing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everybody was walking sideways.&lt;/strong&gt; A tester told me the old man on the bench "keeps turning left and right". He was right, and it wasn't the animation. Frames are found by connected-component labelling and each one is cropped to its own content, then anchored at the centroid of its bottom slab — the feet. When an arm moves, the bounding box changes, so the crop changes, so the anchor changes, so the &lt;em&gt;body&lt;/em&gt; jumps. The fix is to measure the error and cancel it: stamp every frame at its own anchor, find the whole-pixel shift that best overlays it on the first frame, fold that back in. The build now prints what it corrected, and the answer was much worse than one old man:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mc.walk        10px      ← the player character, all night
oldman.walk     9px
nurse.walk_far  7px
intern.kneel    6px
…12 animations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ten pixels on a 132-pixel sprite. Nobody had reported the player sliding around, because nobody looks at the thing they're steering. They looked at the old man sitting still, where the same defect had nowhere to hide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thirty characters made the game worse.&lt;/strong&gt; I expanded the story pool to thirty entries and five portraits ended up playing eighteen named people. The nurse PNG was five different women. You notice in about four seconds, and then nothing in the building is true any more. Cutting back to six identities and moving the variety into &lt;em&gt;time&lt;/em&gt; is the single best change I made — and I now generate names from a table keyed by sprite, so a story physically cannot invent a second face.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The live API is a different API.&lt;/strong&gt; A Gemini key issued today can call neither &lt;code&gt;gemini-2.0-flash&lt;/code&gt; nor &lt;code&gt;gemini-2.5-flash&lt;/code&gt; — both are closed to new users, and it tells you at request time, as a 404 with a sentence of prose inside it. So the model is an alias, not a pin. Then the free tier started answering &lt;code&gt;503 "This model is currently experiencing high demand"&lt;/code&gt; on roughly one request in three, at random — I spent twenty minutes certain my schema was malformed before I noticed a &lt;em&gt;plain&lt;/em&gt; request failing the same way. Retrying the same model against a capacity wall is optimism, so three attempts rotate across two models with backoff. It lands on the second one now. And Flash is a thinking model: &lt;code&gt;parts&lt;/code&gt; can carry reasoning beside the answer, and concatenating all of them produces invalid JSON from a model emitting perfectly valid JSON.&lt;/p&gt;

&lt;p&gt;And the disclaimer this game specifically needs: it is &lt;strong&gt;devnet&lt;/strong&gt;. The coins&lt;br&gt;
are test tokens worth nothing, nobody connects a wallet, and no player action&lt;br&gt;
can move real money — a backend operator keypair signs the handovers. The&lt;br&gt;
operator address shows up in the explorer links, so the ending says it plainly:&lt;br&gt;
if the game works on you, give something to someone who needs it, not to that&lt;br&gt;
address.&lt;/p&gt;

&lt;p&gt;One more, for anyone about to reach for a Solana tutorial: &lt;strong&gt;there is no API key.&lt;/strong&gt; Devnet's RPC is public and keyless. What you need is a signing key, which nobody issues to you — &lt;code&gt;Keypair.generate()&lt;/code&gt; is the whole ceremony. The one thing worth paying attention to is that the public faucet is rate limited and frequently dry, which it told me in production terms about eight times in a row, so a provider endpoint in &lt;code&gt;SOLANA_RPC_URL&lt;/code&gt; is the difference between a demo that works when four judges open it at once and one that doesn't.&lt;/p&gt;

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

&lt;p&gt;I'm submitting to three: &lt;strong&gt;Best Use of Google AI&lt;/strong&gt;, &lt;strong&gt;Best Use of ElevenLabs&lt;/strong&gt;, and &lt;strong&gt;Best Use of Solana.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Google AI
&lt;/h3&gt;

&lt;p&gt;Gemini is not just an AI feature in THE NEXT SHIFT — it is &lt;strong&gt;the mirror that has been watching your entire night.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At 06:00, Gemini receives what you earned, what you spent on yourself, what you spent on other people, your final mood, and a timestamped history of every choice you made — including how those choices eventually turned out.&lt;/p&gt;

&lt;p&gt;It then writes the cracked mirror's reflection of your shift in exactly three sentences. The response is schema-controlled, the final sentence must stay small and physical, and Gemini is explicitly forbidden from moralising or even using the word "kindness."&lt;/p&gt;

&lt;p&gt;The result is not a generic ending generated from a final score. Gemini sees the whole sequence of the player's night and turns it into a personalized reflection of what actually happened.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of ElevenLabs
&lt;/h3&gt;

&lt;p&gt;ElevenLabs is &lt;strong&gt;why THE NEXT SHIFT is meant to be played with headphones.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It gives a voice to the previous player's message waiting inside locker 14, the hospital desk calls that interrupt your shift, and the cracked mirror at 06:00.&lt;/p&gt;

&lt;p&gt;But those voices are not simply played as clean text-to-speech. The previous player's message and the desk calls are band-passed to &lt;strong&gt;300–3400 Hz&lt;/strong&gt;, soft-clipped with &lt;code&gt;tanh&lt;/code&gt;, and layered over carrier hiss so they actually sound like transmissions coming through an old walkie-talkie.&lt;/p&gt;

&lt;p&gt;The mirror is deliberately different: its voice plays dry, without the radio processing.&lt;/p&gt;

&lt;p&gt;That means ElevenLabs is not sitting on top of the game as narration — its voices belong to different physical objects inside the world, and the way each voice sounds tells you where it is coming from.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Solana
&lt;/h3&gt;

&lt;p&gt;Solana is not used as a receipt after the game — &lt;strong&gt;the chain is part of the premise.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The opening balance you find in locker 14 comes from the previous player's handover. At the end of your own shift, you decide how many coins remain for the next person and leave them a message of up to 140 characters.&lt;/p&gt;

&lt;p&gt;Each handover becomes a Solana devnet transaction containing a &lt;code&gt;SystemProgram.transfer&lt;/code&gt; and a memo with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{app, shift, leftCoins, msg, prev}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;prev&lt;/code&gt; field points to the signature of the shift that player inherited, turning the handovers into a linked chain rather than a list whose ordering has to be trusted.&lt;/p&gt;

&lt;p&gt;The game can therefore verify the relationship between one shift and the next, detect a broken link, and reconstruct the previous handovers shown on the title screen.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;devnet&lt;/strong&gt;: the coins are test tokens worth nothing, players connect no wallet, and no player action can move real money.&lt;/p&gt;

&lt;p&gt;What matters is the idea behind the chain: every player begins with something another anonymous player chose to leave behind, and eventually has to decide what the next stranger will find in the same locker.&lt;/p&gt;




&lt;p&gt;Solo submission — built and designed by Iclal Doğan.&lt;br&gt;
GitHub: &lt;a href="https://github.com/miclaldogan/the-next-shift" rel="noopener noreferrer"&gt;@miclaldogan&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bring headphones. Mop the corridor. And when you get to the locker, don't count it twice — you already know what you're going to do.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>ECHOLALIA: A Haunted Desktop Where Two AI Voices Finish Writing You</title>
      <dc:creator>İclal Doğan</dc:creator>
      <pubDate>Mon, 13 Jul 2026 02:14:20 +0000</pubDate>
      <link>https://dev.to/iclaldogan/echolalia-a-haunted-desktop-where-two-ai-voices-finish-writing-you-5hhk</link>
      <guid>https://dev.to/iclaldogan/echolalia-a-haunted-desktop-where-two-ai-voices-finish-writing-you-5hhk</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;ECHOLALIA is a psychological-horror art simulation that runs in your browser as a haunted operating system — and the horror is that you are not the one playing it.&lt;/p&gt;

&lt;p&gt;You don't control a character. You put on headphones, and at 3:33 AM you log into a dead writer's desk — an antique, candlelit machine carved out of heavy oak — where two voices are already waiting for you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CRITIC&lt;/strong&gt; speaks into your left ear: cold, precise, perfectionist. He hunts your clichés and takes your sentences apart on literary grounds — while quietly feeding the dread.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MUSE&lt;/strong&gt; speaks into your right ear: fervent, boundaryless, in love with the worst thing you could possibly write. She calls the Critic an idiot, and she whispers your name. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The two voices — CRITIC in your left ear, MUSE in your right — arguing over your shoulder before you have written a single word.&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%2F1kzv6ht6m71ntvqt8f01.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%2F1kzv6ht6m71ntvqt8f01.png" alt=" " width="800" height="500"&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%2Fqc53bglshrwmphxbjjnf.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%2Fqc53bglshrwmphxbjjnf.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Before you type anything, they are already fighting about you. CRITIC (left) calls you Julian; MUSE (right) corrects him with the name you actually gave.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They are the two halves of a writer's psyche, and they are both powered by Google Gemini. They interrogate you. They read you. They hand you back a manuscript that is already started — mid-sentence, in a voice suspiciously like your own. Then you write, and they tear it apart live. A folder quietly fills with photographic "evidence." An impossible archive answers questions you should never have asked. And somewhere around the tenth sentence, you notice that pressing keys no longer produces your words.&lt;/p&gt;

&lt;p&gt;The design principle is &lt;strong&gt;"Radical Intimacy, Slow Dispossession"&lt;/strong&gt;: the closer the voices get — the more they know you, the more tenderly they say your name — the less of the manuscript is still yours. Every generation happens live, per playthrough. Nothing is pre-scripted. Two people never descend the same way.&lt;/p&gt;

&lt;p&gt;In the final stretch every keystroke renders the voices' words instead of yours — total loss of the keyboard. Then the machine begins to die: the windows go out one by one, the candlelight gutters down from a warm glow to a 5% flicker to pitch black, and the whole desk collapses into the dark. What it whispers at the very end — in a voice that finally uses your real name — is the one thing I'm keeping out of this post. You'll want to hear that one yourself.&lt;/p&gt;

&lt;p&gt;ECHOLALIA is not a game you win. It is a game that finishes writing you, collapses the desk into darkness, and hands you the manuscript to keep — a &lt;code&gt;.md&lt;/code&gt; file with two authors, only one of whom you agreed to.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;What it does in the game&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Gemini&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Builds a psychological profile from your conversation · writes your manuscript's personalized half-finished opening · critiques every sentence in two distinct characters, with an anti-repetition memory of everything said tonight · seizes the editor to type sinister continuations · fabricates every page of the in-game OBSCURA archive · writes the finale your own keystrokes reveal.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Imagen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Develops sepia, damaged-glass-plate "evidence" photographs from your sentences · paints the desktop backdrop from your profile after the reading.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ElevenLabs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gives both voices real voices — panned hard left / right to match their windows, with name-lines whispered · generates the sounds your sentences describe — footsteps, tape hiss, knocking — through the Sound Effects API.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How it connects to the theme
&lt;/h2&gt;

&lt;p&gt;The prompt asks for passion — obsession, devotion, the love that fuels late-night side projects. ECHOLALIA is built out of the one passion I have never managed to put down: writing, and the two voices every writer carries at 3 AM.&lt;/p&gt;

&lt;p&gt;Because that is what the Critic and the Muse really are. Not villains — the two halves of any creative obsession. The perfectionist in your left ear who is certain everything you make is a cliché, and the muse in your right who is in love with the darkest, rawest, worst thing you could possibly say. Anyone who has ever cared too much about a thing they were making knows this fight intimately. I just gave it two voices, panned them hard left and right, and let them argue over your shoulder while you work.&lt;/p&gt;

&lt;p&gt;And I am unreasonably in love with sound — so the whole game is staged for headphones. The voices are real voices; the sounds your sentences describe get conjured out of the air; your name arrives as a whisper. Passion, obsession, the thing you cannot stop making even as it starts making you — that is not a theme bolted onto ECHOLALIA. It is the entire machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  A word before you play
&lt;/h2&gt;

&lt;p&gt;Bring headphones. This is non-negotiable — the two voices live in separate ears, some lines are whispered, and on speakers you lose half the game. Answer the interrogation honestly, too: the voices build everything — your manuscript, every critique, your fabricated archive, your ending — out of what you actually tell them. Lie to them and all you get is a shallower haunting. A full descent runs 10–15 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  On the voices
&lt;/h2&gt;

&lt;p&gt;Some of you will ask why the two voices contradict each other so violently — why one is glacial and the other is unhinged. That is the point. They are not two characters; they are one split psyche, and they share a memory of everything said tonight so they never recycle a cruelty. The Critic never curses — his cruelest blow always lands in the calmest tone. The Muse never stops. If it ever feels like the room is arguing &lt;em&gt;about&lt;/em&gt; you rather than &lt;em&gt;with&lt;/em&gt; you — good. It is.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Play it live:&lt;/strong&gt; &lt;a href="https://echolalia-miclaldogan-6337s-projects.vercel.app" rel="noopener noreferrer"&gt;https://echolalia-miclaldogan-6337s-projects.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Put on headphones, turn the lights down, and answer honestly. It runs entirely in the browser — there is nothing to install.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A note for judges: the voices, the live sabotage, the sound effects, OBSCURA, and the full collapse all run out of the box. The sepia "evidence" photographs are the single paid-tier feature (Google Imagen has no free image quota — see &lt;strong&gt;Cost Safety&lt;/strong&gt; in the repo), so that folder may stay empty on the shared key. The descent is whole without them. If the shared voice quota ever runs dry mid-demo, the wax seal at the bottom-right of the taskbar opens &lt;strong&gt;The Vault&lt;/strong&gt;, where you can paste your own ElevenLabs key for the sitting.&lt;/p&gt;
&lt;/blockquote&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/miclaldogan" rel="noopener noreferrer"&gt;
        miclaldogan
      &lt;/a&gt; / &lt;a href="https://github.com/miclaldogan/echolalia" rel="noopener noreferrer"&gt;
        echolalia
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🕯️ A psychological-horror art simulation where two Gemini-powered inner voices — Critic &amp;amp; Muse — read you, sabotage your writing, and slowly stop letting you type. Live AI dialogue, ElevenLabs stereo voices, Imagen evidence, and a manuscript you can't take back.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ECHOLALIA&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;em&gt;A psychological-horror art simulation where the AI is inside your head — and it stops letting you write.&lt;/em&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://echolalia-miclaldogan-6337s-projects.vercel.app" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e304698086e3bb5cf1019ce23148a9c08ea16fe11148baf15ea812ebe355e061/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2545322539362542365f504c41592d6c6976652d3865326632353f7374796c653d666f722d7468652d6261646765" alt="Play Now"&gt;&lt;/a&gt;
&amp;nbsp;
&lt;a href="https://github.com/miclaldogan/echolalia/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0415aa8bc9ca9cc1f078d8500cc9228b839caf8acbb56d15f48c8f69c4264557/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d6337396135623f7374796c653d666f722d7468652d6261646765" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/345fe6d05b79b02f24f3e639a63259d9bb806130d61c7736dea8e1d8e9d3d55a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56616e696c6c615f4a532d6e6f5f6672616d65776f726b2d3234313731303f6c6f676f3d6a617661736372697074266c6f676f436f6c6f723d633739613562"&gt;&lt;img src="https://camo.githubusercontent.com/345fe6d05b79b02f24f3e639a63259d9bb806130d61c7736dea8e1d8e9d3d55a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56616e696c6c615f4a532d6e6f5f6672616d65776f726b2d3234313731303f6c6f676f3d6a617661736372697074266c6f676f436f6c6f723d633739613562" alt="Vanilla JS"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e6e2b06fe949b745d91b5e41136498c4a39198bb8f831fe5acafcf52e4859abb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56657263656c2d507974686f6e5f5365727665726c6573732d3234313731303f6c6f676f3d76657263656c266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/e6e2b06fe949b745d91b5e41136498c4a39198bb8f831fe5acafcf52e4859abb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56657263656c2d507974686f6e5f5365727665726c6573732d3234313731303f6c6f676f3d76657263656c266c6f676f436f6c6f723d7768697465" alt="Vercel"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/dc5c0674b83563e191df10615c484de0e3d18e57bbde092e1da5a4daebf216a4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f6f676c652d47656d696e695f2b5f496d6167656e2d3234313731303f6c6f676f3d676f6f676c65266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/dc5c0674b83563e191df10615c484de0e3d18e57bbde092e1da5a4daebf216a4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f6f676c652d47656d696e695f2b5f496d6167656e2d3234313731303f6c6f676f3d676f6f676c65266c6f676f436f6c6f723d7768697465" alt="Google Gemini"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c840cef70ad34e7cd36f74feaae3c228188b684743b1f960a8c2c5e8a0cac181/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f456c6576656e4c6162732d5454535f2b5f5346582d323431373130"&gt;&lt;img src="https://camo.githubusercontent.com/c840cef70ad34e7cd36f74feaae3c228188b684743b1f960a8c2c5e8a0cac181/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f456c6576656e4c6162732d5454535f2b5f5346582d323431373130" alt="ElevenLabs"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;You don't control a character. You put on headphones and sit down at a dead writer's desk after midnight.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/miclaldogan/echolalia/docs/screenshots/play_03_firstsentence.jpg"&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%2Fmiclaldogan%2Fecholalia%2FHEAD%2Fdocs%2Fscreenshots%2Fplay_03_firstsentence.jpg" alt="The wooden desk: CRITIC (left), the manuscript (center), and MUSE (right), carved out of dark oak" width="92%"&gt;&lt;/a&gt;
  &lt;br&gt;
  &lt;i&gt;CRITIC in your left ear, MUSE in your right, and a manuscript that is already writing itself.&lt;/i&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The premise&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;It is &lt;strong&gt;3:33 AM&lt;/strong&gt;. You log into a crude wooden machine — an antique, candlelit desktop carved out of heavy oak — and two voices are already waiting for you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CRITIC&lt;/strong&gt; speaks into your &lt;strong&gt;left ear&lt;/strong&gt;: cold, precise, perfectionist. He hunts your clichés and tears your sentences apart on literary grounds — while quietly feeding the dread.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MUSE&lt;/strong&gt; speaks into your &lt;strong&gt;right ear&lt;/strong&gt;: fervent, boundaryless, in love with the worst thing you could possibly write. She calls the Critic an idiot and whispers your name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They are the two halves…&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/miclaldogan/echolalia" 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;ECHOLALIA is deliberately &lt;strong&gt;frameworkless and buildless&lt;/strong&gt; — vanilla HTML + TailwindCSS (CDN) + vanilla JS ES modules. No framework, no bundler, no build step. The browser is a fat client that owns 100% of the game state: the whole session lives in one &lt;code&gt;gameState&lt;/code&gt; object in memory, which means &lt;strong&gt;the client is the save file&lt;/strong&gt; — the export button just serializes what you lived through. The backend is a set of pure, stateless Python functions on Vercel (Fluid Compute), one file per endpoint — &lt;code&gt;profile · chat · sabotage · tts · sfx · image · browser · ping&lt;/code&gt; — and the API keys never leave the server side. The frontend only ever calls its own &lt;code&gt;/api/*&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A few systems do the heavy lifting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A shared-psyche dialogue engine.&lt;/strong&gt; Both voices run on Gemini &lt;code&gt;3.1-flash-lite&lt;/code&gt; — chosen specifically because ~1s latency is what makes the sabotage feel &lt;em&gt;live&lt;/em&gt;; a slower model would break the possession. They carry an anti-repetition memory of the whole night so no insult is ever recycled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A possessed manuscript editor.&lt;/strong&gt; Backspace, Delete, and Ctrl+Z are dead — what is written stays written (that is not a bug). As the night deepens, the voices seize the keyboard more and more often, typing dark continuations into your document while you watch; in the final stretch, every key you press renders &lt;em&gt;their&lt;/em&gt; words instead of yours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OBSCURA — a fake browser.&lt;/strong&gt; It fabricates encyclopedia entries, dead forum threads, and newspaper clippings for any query, weaving your profile into them. It never touches the real internet, and every page is sanitized twice (server-side tag allowlist + client-side DOM scrub).&lt;/li&gt;
&lt;/ul&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%2Fanc9tudm6qdszz97p59s.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%2Fanc9tudm6qdszz97p59s.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OBSCURA answers any search with an invented archive. Here, a whole encyclopedia entry — Elara Vance, a recordist who tried to capture absolute silence — conjured on the spot by Gemini, and quietly stitched from what you told the voices.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A pure-CSS "wooden desk."&lt;/strong&gt; The entire aesthetic — charred-oak grain via an SVG turbulence filter, carved boards, iron nails, sealing wax, letterpress text — is CSS. Zero image assets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failure that stays in fiction.&lt;/strong&gt; Timeouts and quota errors never surface a dialog box; the screen flickers like a guttering candle, a voice goes quiet, or "the air grows thin."&lt;/li&gt;
&lt;/ul&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%2F26rfbzgjuyedr2ifuel0.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%2F26rfbzgjuyedr2ifuel0.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I'm submitting to two: &lt;strong&gt;Best Use of Google AI&lt;/strong&gt; and &lt;strong&gt;Best Use of ElevenLabs.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Google AI
&lt;/h3&gt;

&lt;p&gt;Gemini is not a feature in ECHOLALIA — it is &lt;strong&gt;both authors.&lt;/strong&gt; In a single playthrough Gemini builds your psychological profile from the conversation, writes the personalized half-finished sentence it hands back to you, critiques every sentence you write in two distinct characters with memory of the whole night, seizes the editor to type sinister continuations, fabricates every page of the OBSCURA archive, and writes the finale your own keystrokes reveal. And &lt;strong&gt;Google Imagen&lt;/strong&gt; does all the &lt;em&gt;seeing&lt;/em&gt; — it develops your sentences into sepia, damaged-glass-plate evidence photographs and paints the desktop backdrop from your profile. Two of Google's models, doing every word and every image in the game, live, with nothing pre-scripted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of ElevenLabs
&lt;/h3&gt;

&lt;p&gt;ElevenLabs is &lt;em&gt;why you need the headphones.&lt;/em&gt; It gives the Critic and the Muse real, distinct voices, &lt;strong&gt;panned hard left and right&lt;/strong&gt; to match their windows — so the argument physically happens on two sides of your head — and the lines that carry your name are whispered. But it isn't only speech: the &lt;strong&gt;Sound Effects API&lt;/strong&gt; generates the sounds your own prose describes — footsteps, tape hiss, a knock at a door you wrote — so the world answers what you type. And &lt;strong&gt;The Vault&lt;/strong&gt; lets a judge paste their own ElevenLabs key mid-demo if the shared quota dies, so the voices never have to fall silent.&lt;/p&gt;




&lt;p&gt;Solo submission — built and designed by İclal Doğan (&lt;a href="https://github.com/miclaldogan" rel="noopener noreferrer"&gt;@miclaldogan&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Bring headphones. Answer honestly. And if the Critic asks whose hand wrote the second half — don't check.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>RESIDUES: A Terminal Game Inside the Dying Mind of Alan Turing</title>
      <dc:creator>İclal Doğan</dc:creator>
      <pubDate>Sat, 20 Jun 2026 23:53:24 +0000</pubDate>
      <link>https://dev.to/iclaldogan/residues-a-terminal-game-inside-the-dying-mind-of-alan-turing-2p67</link>
      <guid>https://dev.to/iclaldogan/residues-a-terminal-game-inside-the-dying-mind-of-alan-turing-2p67</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/june-game-jam-2026-06-03"&gt;June Solstice Game Jam&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;em&gt;Content note: this game deals with suicide, chemical castration, and the slow breakdown of a mind. It's a story about the death of Alan Turing, told honestly.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;strong&gt;RESIDUES&lt;/strong&gt; is a terminal-native narrative puzzle game, written in Rust, that runs entirely inside your terminal — no graphics window, no mouse, just 24-bit amber phosphor in the dark.&lt;/p&gt;

&lt;p&gt;You are inside the failing mind of Alan Turing on the night of his death — Wilmslow, 8 June 1954. As his cognition collapses, he replays the entire lineage of computing as six interactive puzzles, each one rebuilding the real idea its pioneer gave the world. The principle behind every act is &lt;strong&gt;"Bright Puzzle, Dark Undertow":&lt;/strong&gt; the puzzle in front of you is a clean, genuinely deep technical challenge, while underneath runs the human tragedy of the mind that invented it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Act&lt;/th&gt;
&lt;th&gt;The Mind&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;What you actually do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;I&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Joseph-Marie Jacquard&lt;/td&gt;
&lt;td&gt;1804&lt;/td&gt;
&lt;td&gt;Punch an 8×8 bit matrix into modular cards — a continuous roll tears, a block-chain jams, only a looping deck survives.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;II&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Charles Babbage&lt;/td&gt;
&lt;td&gt;1837&lt;/td&gt;
&lt;td&gt;Derive a baseline by the method of differences, then survive the carry crisis by staggering delay buffers so the carry travels as a wave.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;III&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ada Lovelace&lt;/td&gt;
&lt;td&gt;1843&lt;/td&gt;
&lt;td&gt;Write real assembly on a 3-register machine; overrun the linear cap to unlock loops, then compute a checksum with a loop that devours its own counter.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IV&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;George Boole&lt;/td&gt;
&lt;td&gt;1854&lt;/td&gt;
&lt;td&gt;Steer a grid of logic gates to a target checksum while the &lt;em&gt;displayed&lt;/em&gt; output starts lying — but the truth always holds beneath.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;V&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Claude Shannon&lt;/td&gt;
&lt;td&gt;1937&lt;/td&gt;
&lt;td&gt;Assign prefix-free codes within a fixed channel capacity, then add a parity guard against bit-flip noise. Real information theory.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alan Turing&lt;/td&gt;
&lt;td&gt;1936&lt;/td&gt;
&lt;td&gt;Operate a real Turing machine — a head over a tape, a transition table — stabilizing the five prior acts' corrupted residues until the machine reaches HALT.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And the puzzles are &lt;em&gt;real&lt;/em&gt; — not reskinned button-presses. There's a working 7-instruction assembly interpreter, a genuine Turing machine with a complete transition table, real Shannon channel-capacity math, real carry-propagation. &lt;strong&gt;The puzzles ARE the history.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it connects to the jam.&lt;/strong&gt; The June solstice is the year's turning point — the hinge where light begins to lose to darkness. RESIDUES is built entirely on that hinge. Alan Turing was born in June; June is also Pride Month, and the jam itself names him — the father of the Turing Test, persecuted for who he was. Across every act the candle on the desk burns lower, the heartbeat speeds the metronome, and memory corrupts into noise. &lt;em&gt;Light and darkness, the passage of time, a turning point&lt;/em&gt; — those are the jam's own words, and they are the game's three core systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A word before you play.&lt;/strong&gt; Jacquard and Babbage ease you in — the opening acts are gentle, and we're warming you up on purpose. But fair warning: after that, the machine starts asking you to actually &lt;em&gt;think&lt;/em&gt;. If you get stuck somewhere, don't be mad at us — some acts are deliberately demanding with little hand-holding. And if you &lt;em&gt;don't&lt;/em&gt; get stuck? Then you already know this craft, and you have our respect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Turing's voice.&lt;/strong&gt; Some of you will ask why we gave Turing such a broken, sick, dissolving voice. Here's why: the game dramatizes his final days — the drugs he was forced to take, and the very night he died. There was cyanide in the next room for his experiments and a half-eaten apple by his bed; whether it was an accident, an experiment, or a choice, no one will ever know. We didn't think a man would have a clear, beautiful voice on his last night — so we deliberately didn't give him one. The decay you hear is the point.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/or6dscTENFs" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;It's a full ~15-minute playthrough, so feel free to skip around — every act is in there. If you're short on time, the chapters in the video description jump straight to the key moments: &lt;strong&gt;Act III (writing real assembly)&lt;/strong&gt;, &lt;strong&gt;Act VI (the Turing machine)&lt;/strong&gt;, and &lt;strong&gt;the ending&lt;/strong&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%2F5nspoj4vvki3qxx8w1np.jpeg" 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%2F5nspoj4vvki3qxx8w1np.jpeg" alt=" " width="800" height="419"&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%2F4twhmhyla1n8x6pdqmn0.jpeg" 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%2F4twhmhyla1n8x6pdqmn0.jpeg" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/miclaldogan" rel="noopener noreferrer"&gt;
        miclaldogan
      &lt;/a&gt; / &lt;a href="https://github.com/miclaldogan/residuesTerminal" rel="noopener noreferrer"&gt;
        residuesTerminal
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Residues: terminal edition — a true-color Rust/Ratatui TUI port (cinematic typewriter prelude, Braille portraits, Jacquard/Babbage acts)
    &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;RESIDUES — An Engine of Residual Minds&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A terminal-native narrative puzzle game about the birth of computation, written in Rust.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The most terrifying part is learning how to forget."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;RESIDUES runs entirely inside your terminal — no graphics window, no mouse — rendering a truecolor (24-bit) amber-phosphor aesthetic. You are inside the failing mind of Alan Turing on the night of his death (Wilmslow, 8 June 1954). As his cognition collapses, he replays the entire lineage of computing as six interactive puzzles, each one rebuilding the actual idea its pioneer gave the world.&lt;/p&gt;
&lt;p&gt;The design principle is &lt;strong&gt;"Bright Puzzle, Dark Undertow":&lt;/strong&gt; every act is a clean, genuinely deep technical challenge, while underneath runs the human tragedy of the mind that invented it.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Six Acts&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Each act is a real computational toy — not a reskinned button-press. You don't read &lt;em&gt;about&lt;/em&gt; the machine; you operate one.&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Act&lt;/th&gt;
&lt;th&gt;Mind&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/miclaldogan/residuesTerminal" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;It's genuinely easy to run yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/miclaldogan/residuesTerminal.git
&lt;span class="nb"&gt;cd &lt;/span&gt;residuesTerminal
cargo run &lt;span class="nt"&gt;--release&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or zero-install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://raw.githubusercontent.com/miclaldogan/residuesTerminal/main/run.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Play with headphones, in a truecolor terminal.&lt;/strong&gt; The audio is binaural — ghost whispers are hard-panned left and right, and the heartbeat sits under everything — so a lot of the experience is lost on speakers. (The game probes for &lt;code&gt;mpv&lt;/code&gt; / &lt;code&gt;ffplay&lt;/code&gt; / &lt;code&gt;mpg123&lt;/code&gt;; if none is installed it runs completely silent but fully playable — no crash.)&lt;/p&gt;

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

&lt;p&gt;RESIDUES is written from scratch in &lt;strong&gt;Rust&lt;/strong&gt; (~10,400 lines, 65 passing tests) on &lt;strong&gt;ratatui + crossterm&lt;/strong&gt;. The challenge wasn't drawing screens — it was making a terminal &lt;em&gt;feel alive&lt;/em&gt;. A few systems do the heavy lifting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A real assembly micro-compiler&lt;/strong&gt; (&lt;code&gt;LOAD/STORE/ADD/SUB/IF_Z/JMP/HALT&lt;/code&gt;) with its own error codes — Lovelace's act is genuinely a register-allocation puzzle, and a &lt;code&gt;[REGISTRY ERROR]&lt;/code&gt; is the &lt;em&gt;narrative&lt;/em&gt; trigger that unlocks loops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A crate-free, lock-free audio engine&lt;/strong&gt; that spawns detached OS players, layering an ambient score, rain, hard-panned binaural whispers, and synced voice-overs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A live heartbeat that drives the world&lt;/strong&gt; — the BPM readout isn't decoration; it physically speeds the background metronome, climbing as Turing's interrogation tightens and spiking into arrhythmia on a wrong answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A decay engine&lt;/strong&gt; — as the chemical toxicity rises, the text on screen corrupts into glyphs in real time, so you watch the memory being erased.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A candle that is the only light source&lt;/strong&gt;, with a radial light-degradation engine anchored on the flame, guttering from 100% down to a 5% flicker by the final act.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A PNG → truecolor half-block renderer&lt;/strong&gt; for the cinematic portraits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I used Google's &lt;strong&gt;Gemini&lt;/strong&gt; as a brainstorming partner for the historical framing and act structure. The voice and whisper audio was generated with &lt;strong&gt;ElevenLabs&lt;/strong&gt; (paid plan, commercial license).&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Ode to Alan Turing.&lt;/strong&gt; Turing isn't a tribute bolted on at the end — he's the gravity the whole game falls toward, across all three things the category asks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mechanics.&lt;/strong&gt; Act VI is a &lt;em&gt;literal&lt;/em&gt; Turing machine: a tape, a moving head, a transition table, and corrupted residues you stabilize until it reaches HALT. You don't read about the Universal Machine — you run one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Narrative.&lt;/strong&gt; His full arc is the climax: breaking Enigma, the silence of the Official Secrets Act, the trial for "gross indecency," the chemical castration, and his last night. The ending — which I'm keeping out of this post on purpose — recontextualizes the entire descent. It's in the video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design.&lt;/strong&gt; Five centuries of computing — Jacquard's cards, Babbage's gears, Lovelace's loops, Boole's logic, Shannon's entropy — are arranged as a pilgrimage that exists to deliver you to Turing's desk, in his birth month, in a jam built around the very turning point his life embodies.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Solo submission — built and designed by Iclal Doğan.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gamechallenge</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>I Built a 1920s Butler AI That Runs Entirely on My Linux Machine. Then I Abandoned It. Then Copilot Helped Me Fix It.</title>
      <dc:creator>İclal Doğan</dc:creator>
      <pubDate>Sat, 06 Jun 2026 12:22:25 +0000</pubDate>
      <link>https://dev.to/iclaldogan/i-built-a-1920s-butler-ai-that-runs-entirely-on-my-linux-machine-then-i-abandoned-it-then-copilot-5ela</link>
      <guid>https://dev.to/iclaldogan/i-built-a-1920s-butler-ai-that-runs-entirely-on-my-linux-machine-then-i-abandoned-it-then-copilot-5ela</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Bantz&lt;/strong&gt; is a local-first, offline-capable AI assistant that runs entirely on your Linux machine. It presents itself as a 1920s English butler — always polite, subtly sarcastic, and absolutely convinced he is a real person standing in the room with you.&lt;/p&gt;

&lt;p&gt;I'm a Turkish speaker on a Linux desktop. Every cloud assistant I tried spoke to me in a foreign language, phoned home to someone else's server, and forgot everything the moment the session ended. I wanted something different: an assistant that speaks Turkish natively, runs on my own hardware, remembers its context, and actually controls my desktop. So I started building Bantz.&lt;/p&gt;

&lt;p&gt;The concept is ambitious. At its core: a Turkish ↔ English translation layer powered by Helsinki-NLP's MarianMT, a multi-step tool planner that can chain web search, Gmail, Calendar, shell commands, filesystem access, and AT-SPI desktop automation — all coordinated by an LLM running locally via Ollama. On top of that: voice I/O via faster-whisper and Piper TTS, persistent memory backed by ChromaDB + a SQLite knowledge graph (MemPalace), a 6-state butler persona that shifts tone based on CPU load and time of day, and a Textual TUI with a live health-status bar.&lt;/p&gt;

&lt;p&gt;The architecture was genuinely interesting. The execution, as of May 2026, was a mess.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub repo:&lt;/strong&gt; &lt;a href="https://github.com/miclaldogan/bantzv2" rel="noopener noreferrer"&gt;github.com/miclaldogan/bantzv2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Broadcast Channel&lt;/strong&gt; — chatting with Bantz, web search + desktop control in action:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmiclaldogan%2Fbantzv2%2Fmain%2Fbantz-demo%2Fseg1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmiclaldogan%2Fbantzv2%2Fmain%2Fbantz-demo%2Fseg1.gif" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full walkthrough&lt;/strong&gt; — all pages of the Operations Center:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmiclaldogan%2Fbantzv2%2Fmain%2Fbantz-demo%2Fseg5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmiclaldogan%2Fbantzv2%2Fmain%2Fbantz-demo%2Fseg5.gif" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Fmiclaldogan%2Fbantzv2%2Fmain%2Fbantz-demo%2FbantzChat.jpeg" width="800" height="450"&gt;&lt;/td&gt;
&lt;td&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%2Fmiclaldogan%2Fbantzv2%2Fmain%2Fbantz-demo%2FbantzVitals.jpeg" width="800" height="450"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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%2Fmiclaldogan%2Fbantzv2%2Fmain%2Fbantz-demo%2FbantzLogs.jpeg" width="800" height="450"&gt;&lt;/td&gt;
&lt;td&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%2Fmiclaldogan%2Fbantzv2%2Fmain%2Fbantz-demo%2FbantzDirectives.jpeg" width="800" height="450"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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%2Fmiclaldogan%2Fbantzv2%2Fmain%2Fbantz-demo%2FbantzAnomalyWatch.jpeg" width="800" height="450"&gt;&lt;/td&gt;
&lt;td&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%2Fmiclaldogan%2Fbantzv2%2Fmain%2Fbantz-demo%2FbantzSettings.jpeg" width="800" height="450"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before — May 2026
&lt;/h3&gt;

&lt;p&gt;I had a 17-issue backlog and a &lt;code&gt;BROKEN_STATE.md&lt;/code&gt; file I'd written to document the damage. Here's what it said:&lt;/p&gt;

&lt;p&gt;The feature audit was brutal:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Voice input (Whisper)&lt;/td&gt;
&lt;td&gt;🔴 Broken — 3 packages missing, Picovoice key unset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TUI status bar&lt;/td&gt;
&lt;td&gt;❌ Didn't exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First-run onboarding&lt;/td&gt;
&lt;td&gt;❌ Blank cursor, zero guidance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-provider LLM support&lt;/td&gt;
&lt;td&gt;🔴 Every finalizer hardcoded &lt;code&gt;ollama&lt;/code&gt; directly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Turkish response latency&lt;/td&gt;
&lt;td&gt;🔴 12–18 seconds end-to-end&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--doctor&lt;/code&gt; diagnostic&lt;/td&gt;
&lt;td&gt;🔴 Actively lying — reported working memory as broken&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TUI rendering&lt;/td&gt;
&lt;td&gt;🔴 Entire layout duplicated on screen after every message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desktop UI logs&lt;/td&gt;
&lt;td&gt;🔴 WebSocket handler silently crashed on every log event&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The most embarrassing part: I'd built a sophisticated multi-provider LLM router (&lt;code&gt;router.py&lt;/code&gt;) that could dispatch to Claude, OpenAI, Gemini, or Ollama based on config — and then every single callsite in &lt;code&gt;finalizer.py&lt;/code&gt;, &lt;code&gt;summarizer.py&lt;/code&gt;, and the streaming path had just... hardcoded &lt;code&gt;from bantz.llm.ollama import ollama&lt;/code&gt; directly. The router was completely bypassed. Anyone who configured &lt;code&gt;BANTZ_LLM_PROVIDER=claude&lt;/code&gt; would get Ollama responses with no error, no warning, nothing.&lt;/p&gt;

&lt;p&gt;The first-run experience was particularly painful. &lt;code&gt;bantz --once "merhaba"&lt;/code&gt; would hang in complete silence for up to 30 seconds as MarianMT loaded, Ollama inferred, and Piper synthesized — all sequentially, all silently. New users killed the process and never came back.&lt;/p&gt;

&lt;h3&gt;
  
  
  After — June 2026
&lt;/h3&gt;

&lt;p&gt;Seven issues closed in a single focused session, all squash-merged to &lt;code&gt;main&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PR #467 — 1-line fix, total silence explained.&lt;/strong&gt; The &lt;code&gt;_WSLogHandler&lt;/code&gt; inside &lt;code&gt;WsBroadcastServer&lt;/code&gt; referenced &lt;code&gt;self._log_q&lt;/code&gt; but the actual queue attribute was &lt;code&gt;self._q&lt;/code&gt;. One character typo. Every log record since the WebSocket server was written had thrown an &lt;code&gt;AttributeError&lt;/code&gt; that got silently swallowed, so the Tauri desktop UI had received zero log output. Fixed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PRs #468 &amp;amp; #469 — The router that wasn't routed to.&lt;/strong&gt; Replaced all three &lt;code&gt;finalizer.py&lt;/code&gt; callsites and the &lt;code&gt;summarizer.py&lt;/code&gt; Gemini/Ollama fallback chain with &lt;code&gt;from bantz.llm.router import get_llm&lt;/code&gt;. Added &lt;code&gt;get_llm = get_provider&lt;/code&gt; as a convenience alias in &lt;code&gt;router.py&lt;/code&gt;. Claude, OpenAI, and Gemini users now actually get their configured provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PR #470 — Service dots that told the truth.&lt;/strong&gt; The TUI's health-status bar was initialised with the hardcoded key &lt;code&gt;"Ollama"&lt;/code&gt; and &lt;code&gt;_probe_services()&lt;/code&gt; only called &lt;code&gt;check_ollama()&lt;/code&gt;. Added dynamic service key resolution from config, new &lt;code&gt;check_claude()&lt;/code&gt; and &lt;code&gt;check_openai()&lt;/code&gt; coroutines, and a dispatch table to route to the right health check based on the active provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PR #471 — The TUI duplication bug.&lt;/strong&gt; &lt;code&gt;_erase_prompt_line()&lt;/code&gt; used &lt;code&gt;os.write(1, ...)&lt;/code&gt; to send raw ANSI cursor-movement escapes directly to stdout while Rich Live was simultaneously rendering to the same terminal. This caused a race condition that reproduced the entire TUI block below the real one on every message. The fix: added a &lt;code&gt;Layout(name="prompt", size=1)&lt;/code&gt; panel to the layout tree and replaced the raw write with a state variable (&lt;code&gt;self._prompt_text = ""&lt;/code&gt;). The next Live refresh cycle clears the row cleanly, no escapes needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PR #472 — Cutting Turkish response latency from 18s to under 10s.&lt;/strong&gt; Two independent problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;bridge.to_turkish()&lt;/code&gt; ran on the &lt;strong&gt;full accumulated response&lt;/strong&gt; after all LLM inference finished — sequential, never overlapping.&lt;/li&gt;
&lt;li&gt;No caching. Identical butler stock phrases like &lt;code&gt;"Done. ✓"&lt;/code&gt; re-ran the full neural translation model every single time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Added a 256-entry FIFO LRU cache to &lt;code&gt;_Translator&lt;/code&gt; — common phrases now translate in ~0ms after the first call. Then rewrote &lt;code&gt;finalize_stream()._stream()&lt;/code&gt; to buffer LLM tokens until sentence boundaries (&lt;code&gt;(?&amp;lt;=[.!?])\s+&lt;/code&gt;) and call &lt;code&gt;bridge.to_turkish()&lt;/code&gt; per sentence immediately, yielding translated output while the LLM continues generating the next sentence. Translation now overlaps inference instead of running after it. Also removed the redundant &lt;code&gt;await _to_tr("".join(parts))&lt;/code&gt; re-translation in &lt;code&gt;ws_server.py&lt;/code&gt;'s streaming path — &lt;code&gt;finalize_stream&lt;/code&gt; already emits pre-translated tokens when the bridge is enabled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue #463 — Already fixed (no PR needed).&lt;/strong&gt; Copilot confirmed &lt;code&gt;Live(screen=False)&lt;/code&gt; was already set and &lt;code&gt;REFRESH_FPS = 4&lt;/code&gt; was already present. Closed with an explanatory comment. Sometimes the right fix is recognising there's nothing to fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;I used Copilot in agent mode (Claude Sonnet 4.6) for the entire session. What struck me most was the discipline it brought to a codebase I'd let get messy.&lt;/p&gt;

&lt;p&gt;For every issue, Copilot followed the same workflow without being told to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Read the affected file before touching anything.&lt;/strong&gt; Not a summary — the actual file, end-to-end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search for the exact symbol causing the problem.&lt;/strong&gt; For issue #462, it searched &lt;code&gt;_q|_log_q&lt;/code&gt; in &lt;code&gt;ws_server.py&lt;/code&gt; and immediately surfaced the mismatch. For #465, it searched for every &lt;code&gt;"Ollama"&lt;/code&gt; string literal and found three hardcoded sites at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make the minimal change.&lt;/strong&gt; No unrelated refactors. The &lt;code&gt;_log_q&lt;/code&gt; → &lt;code&gt;_q&lt;/code&gt; fix is literally one word on one line. The router migration replaced 3 identical patterns with identical 2-line substitutions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify syntax before committing.&lt;/strong&gt; &lt;code&gt;python -m py_compile &amp;lt;file&amp;gt;&lt;/code&gt; on every changed file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write the commit message and PR body, then create and merge the PR via &lt;code&gt;gh&lt;/code&gt;.&lt;/strong&gt; Including verifying the issue closed with &lt;code&gt;gh issue view NNN --json state&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most valuable moment was on issue #422 (translation latency). I knew the translation was slow but I'd assumed it was just a hardware limitation — MarianMT on CPU takes what it takes. Copilot traced the full data flow from &lt;code&gt;finalize_stream()&lt;/code&gt; through &lt;code&gt;ws_server.py&lt;/code&gt; and identified that the bottleneck wasn't just the model — it was the architecture: sequential execution after completion, plus identical inputs being re-translated on every call. The sentence-boundary streaming approach it introduced had never occurred to me, and it worked on the first try.&lt;/p&gt;

&lt;p&gt;The other moment I appreciated: issue #463. Rather than making a change to justify its existence, Copilot searched for &lt;code&gt;screen=&lt;/code&gt; in &lt;code&gt;live_ui.py&lt;/code&gt;, confirmed the value was already &lt;code&gt;False&lt;/code&gt;, checked &lt;code&gt;REFRESH_FPS&lt;/code&gt;, and told me the issue was already resolved. Closing a bug report with "this is already fixed" is the correct outcome. That kind of restraint is hard to get from a tool optimised to produce output.&lt;/p&gt;

&lt;p&gt;Bantz isn't finished, voice input still needs its three packages, the &lt;code&gt;--doctor&lt;/code&gt; output still needs polish, and I want to add a proper onboarding flow. But the core pipeline now works correctly for all supported LLM providers, the TUI renders cleanly, Turkish responses arrive in under 10 seconds, and the butler's logs finally reach the desktop UI. That's a project that went from "broken in embarrassing ways" to "actually ships" — and Copilot was the pairing partner that made it happen in a single afternoon.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
