{"seconds":614.915,"sections":[{"id":"s01","label":"What I Built","start":10.75},{"id":"s02","label":"Demo","start":93.95},{"id":"s03","label":"How I Built It","start":140.8},{"id":"s04","label":"Why Does Open Innovation Matter?","start":519.62}],"lines":[{"start":0,"end":9.85,"text":"This is your 10-minute Walk Edition of My Six-Year-Old Can't Do Five Things at Once, So His Screen Shows One. Start walking. I'll tell you when you're halfway.","speaker":"app","role":"intro"},{"start":10.75,"end":13.68,"text":"My son is six and started kindergarten a month ago.","speaker":"source","section":"s01","para":0},{"start":14.24,"end":20.68,"text":"A school morning asks him for five things: eat, brush teeth, get dressed, shoes and jacket, backpack.","speaker":"source","section":"s01","para":0},{"start":21.24,"end":26.68,"text":"Breakfast is easy, because breakfast is one pancake with honey and he is very consistent about that.","speaker":"source","section":"s01","para":0},{"start":27.3,"end":29.01,"text":"The rest is where it falls apart.","speaker":"source","section":"s01","para":0},{"start":29.98,"end":37.74,"text":"He starts getting dressed, remembers his teeth, wants to play, and a few minutes later he is doing all three at once, which means none of them.","speaker":"source","section":"s01","para":0},{"start":38.95,"end":41.4,"text":"I noticed that he is fine with any single step.","speaker":"source","section":"s01","para":1},{"start":41.89,"end":43.51,"text":"What he cannot hold is the list.","speaker":"source","section":"s01","para":1},{"start":43.92,"end":46.61,"text":"So I built a screen for him that never shows a list.","speaker":"source","section":"s01","para":1},{"start":47.8,"end":50.2,"text":"One Thing is a small app for our home network.","speaker":"source","section":"s01","para":2},{"start":50.64,"end":52.65,"text":"I type the routine in plain words.","speaker":"source","section":"s01","para":2},{"start":53.11,"end":58.69,"text":"A Gemma 4 model running on my laptop turns it into a short mission with a theme (I went with rockets).","speaker":"source","section":"s01","para":2},{"start":59.24,"end":61.58,"text":"I read every step and fix what I don't like.","speaker":"source","section":"s01","para":2},{"start":62.56,"end":72.34,"text":"Only after I approve it does it reach the kid screen on the tablet, and there it shows exactly one step at a time: one big emoji, a few words, and one button.","speaker":"source","section":"s01","para":2},{"start":73.58,"end":77.16,"text":"Every rule on that screen comes from something I see on our mornings:","speaker":"source","section":"s01","para":3},{"start":78.35,"end":80.35,"text":"One step on screen, never a list.","speaker":"source","section":"s01","para":4},{"start":80.69,"end":82.09,"text":"Every step is read aloud.","speaker":"source","section":"s01","para":4},{"start":82.44,"end":84.56,"text":"The button has to be held, not tapped.","speaker":"source","section":"s01","para":4},{"start":85.1,"end":87.21,"text":"Brushing teeth is a timer he can't skip.","speaker":"source","section":"s01","para":4},{"start":87.48,"end":88.69,"text":"Nothing ever fails.","speaker":"source","section":"s01","para":4},{"start":89.04,"end":90.45,"text":"The end is always visible.","speaker":"source","section":"s01","para":4},{"start":90.81,"end":92.95,"text":"I approve every mission first.","speaker":"source","section":"s01","para":4},{"start":93.95,"end":98.472,"text":"Try the kid screen yourself: nazboyko.github.io/one-thing/demo.","speaker":"source","section":"s02","para":0},{"start":99.59,"end":102.17,"text":"It plays the built-in sample mission in your browser.","speaker":"source","section":"s02","para":0},{"start":102.68,"end":105.24,"text":"Hold the amber button; a quick tap does nothing.","speaker":"source","section":"s02","para":0},{"start":106.48,"end":112.78,"text":"In the video (79 seconds) I type a routine for getting ready to go outside and give it the theme \"space walk\".","speaker":"source","section":"s02","para":1},{"start":113.39,"end":116.16,"text":"Gemma writes the mission in 2.6 seconds.","speaker":"source","section":"s02","para":1},{"start":116.64,"end":121.42,"text":"I scroll through the steps, approve it, and the kid screen plays the mission to the finale.","speaker":"source","section":"s02","para":1},{"start":122.03,"end":124.49,"text":"The typing is sped up 2x and labeled.","speaker":"source","section":"s02","para":1},{"start":125.47,"end":129.13,"text":"The kid screen runs at normal speed, and you can hear it say each step.","speaker":"source","section":"s02","para":1},{"start":130.41,"end":132.16,"text":"This is the first working version.","speaker":"source","section":"s02","para":2},{"start":132.56,"end":134.01,"text":"I built it in one evening.","speaker":"source","section":"s02","para":2},{"start":134.49,"end":135.753,"text":"My son has not used it yet.","speaker":"source","section":"s02","para":2},{"start":136.51,"end":139.8,"text":"I wanted it finished and checked before it goes in front of him.","speaker":"source","section":"s02","para":2},{"start":140.8,"end":148.63,"text":"The open-source AI at the center is Gemma 4, Google's open-weight model (gemma4:e4b, with thinking turned off).","speaker":"source","section":"s03","para":0},{"start":149.24,"end":152.586,"text":"Ollama, an open-source runtime, runs it on my laptop.","speaker":"source","section":"s03","para":0},{"start":153.35,"end":159.81,"text":"Around them sits one Go binary that uses only the standard library, with a React front end compiled into it.","speaker":"source","section":"s03","para":0},{"start":160.8,"end":163.74,"text":"There is no database, no account and no cloud.","speaker":"source","section":"s03","para":0},{"start":164.3,"end":171.54,"text":"Saved missions are JSON files in a folder, and the only network call the app makes is to Ollama on localhost.","speaker":"source","section":"s03","para":0},{"start":172.73,"end":176.98,"text":"The Go server sends JSON to Ollama running Gemma 4 on the laptop.","speaker":"source","section":"s03","para":1},{"start":177.51,"end":181.242,"text":"The server sanitizes, validates, and retries the JSON.","speaker":"source","section":"s03","para":1},{"start":181.83,"end":184.67,"text":"The parent reads, edits, and approves the mission.","speaker":"source","section":"s03","para":1},{"start":185.2,"end":187.49,"text":"The tablet then shows one step at a time.","speaker":"source","section":"s03","para":1},{"start":188.73,"end":191.41,"text":"Getting a small model to return something I can trust.","speaker":"source","section":"s03","para":2},{"start":191.81,"end":193.26,"text":"I don't want prose from the model.","speaker":"source","section":"s03","para":2},{"start":193.64,"end":195.5,"text":"I want a mission my code can check.","speaker":"source","section":"s03","para":2},{"start":195.93,"end":201.18,"text":"So the request to Ollama carries a JSON schema, and Gemma has to answer in that shape.","speaker":"source","section":"s03","para":2},{"start":201.89,"end":205.94,"text":"A mission holds three to eight steps, and each step is described like this:","speaker":"source","section":"s03","para":2},{"start":207.11,"end":209.13,"text":"The code defines an object structure.","speaker":"source","section":"s03","para":3},{"start":209.68,"end":214.06,"text":"This structure requires an emoji, title, say, mode, and seconds.","speaker":"source","section":"s03","para":3},{"start":214.58,"end":217.31,"text":"The mode can be until_done or for_duration.","speaker":"source","section":"s03","para":3},{"start":218.54,"end":221,"text":"A schema guarantees the shape, not the sense.","speaker":"source","section":"s03","para":4},{"start":221.4,"end":223.81,"text":"So every answer goes through two more functions.","speaker":"source","section":"s03","para":4},{"start":224.35,"end":234.19,"text":"Sanitize fixes what is safe to fix: stray whitespace, Title Case in step titles, a timer outside the allowed range, an \"emoji\" that is not one.","speaker":"source","section":"s03","para":4},{"start":235.19,"end":240.91,"text":"Validate returns plain field errors such as steps[2].title: too many words (at most 6).","speaker":"source","section":"s03","para":4},{"start":241.49,"end":247.06,"text":"If any remain, the server sends them back to the model as a follow-up message and asks once more.","speaker":"source","section":"s03","para":4},{"start":248.29,"end":249.41,"text":"Here is what I typed:","speaker":"source","section":"s03","para":5},{"start":250.57,"end":257.08,"text":"Routine: School morning for a 6-year-old: breakfast, brush teeth, get dressed, shoes and jacket, backpack.","speaker":"source","section":"s03","para":6},{"start":257.56,"end":261.62,"text":"Brushing teeth is the hardest part, split it into short pieces.","speaker":"source","section":"s03","para":6},{"start":261.85,"end":262.75,"text":"Theme: rocket launch","speaker":"source","section":"s03","para":6},{"start":263.94,"end":267.26,"text":"And this is the raw answer, with only the line breaks tidied:","speaker":"source","section":"s03","para":7},{"start":268.48,"end":271.14,"text":"The code shows a rocket launch preparation sequence.","speaker":"source","section":"s03","para":8},{"start":271.61,"end":277.68,"text":"It includes steps like fueling up, polishing teeth, suiting up, sealing gear, and packing the rocket.","speaker":"source","section":"s03","para":8},{"start":278.89,"end":281.29,"text":"I would still change one line before approving it.","speaker":"source","section":"s03","para":9},{"start":281.78,"end":286.67,"text":"\"Keep fueling up!\" sounds like \"eat more\", which the prompt tells the model never to say.","speaker":"source","section":"s03","para":9},{"start":287.91,"end":295.84,"text":"Numbers from my laptop (Apple M5 Max, 64 GB, Ollama 0.35, model already loaded):","speaker":"source","section":"s03","para":10},{"start":297.12,"end":304.18,"text":"Thinking off averaged 2.4 seconds per mission, and it was valid on the first try for 22 of 22 runs.","speaker":"source","section":"s03","para":11},{"start":304.82,"end":309.14,"text":"Thinking on took 11.3 seconds for one run and was not valid.","speaker":"source","section":"s03","para":11},{"start":310.825,"end":316.12,"text":"You're halfway. If you're walking out and back, turn around now.","speaker":"app","role":"halfway"},{"start":317.285,"end":326.755,"text":"The 22 runs went through the server while I tuned the prompt (school mornings, a bedtime, an after-school routine), and the time includes parsing and validation.","speaker":"source","section":"s03","para":12},{"start":327.375,"end":331.515,"text":"The retry never fired; it is covered by tests against a fake Ollama.","speaker":"source","section":"s03","para":12},{"start":332.165,"end":336.525,"text":"Thinking made Gemma several times slower and worse at this job, so it stays off.","speaker":"source","section":"s03","para":12},{"start":337.855,"end":339.524,"text":"The prompt needed real fixes.","speaker":"source","section":"s03","para":13},{"start":340.125,"end":345.725,"text":"The first version returned valid JSON every time, and as a parent I would still have rejected half of it.","speaker":"source","section":"s03","para":13},{"start":346.285,"end":348.895,"text":"Asked for \"breakfast\", it invented cereal.","speaker":"source","section":"s03","para":13},{"start":349.465,"end":355.505,"text":"Asked to split tooth brushing because it is the hardest part, a bedtime run kept it as one two-minute step.","speaker":"source","section":"s03","para":13},{"start":355.915,"end":357.125,"text":"So the prompt now says:","speaker":"source","section":"s03","para":13},{"start":358.305,"end":361.195,"text":"The code ensures only named actions are used.","speaker":"source","section":"s03","para":14},{"start":361.685,"end":365.165,"text":"It also forces hard parts to become two or three separate steps.","speaker":"source","section":"s03","para":14},{"start":366.385,"end":368.76,"text":"Brushing has been split in every run since.","speaker":"source","section":"s03","para":15},{"start":369.285,"end":380.515,"text":"Two more fixes came from reading output the same way: one run said \"eat your breakfast until done\", and another made breakfast a two-minute timed step, which would have locked the button while he eats.","speaker":"source","section":"s03","para":15},{"start":381.715,"end":382.505,"text":"What did not work.","speaker":"source","section":"s03","para":16},{"start":382.905,"end":389.135,"text":"In 3 of 8 morning runs that I read line by line, Gemma folded \"shoes and jacket\" into just \"shoes\".","speaker":"source","section":"s03","para":16},{"start":389.725,"end":393.875,"text":"Four rounds of prompt changes fixed everything else I found, but not this.","speaker":"source","section":"s03","para":16},{"start":394.345,"end":399.125,"text":"The screenshot shows it happening again, unedited: step 5 has no jacket.","speaker":"source","section":"s03","para":16},{"start":400.105,"end":406.285,"text":"This is why the parent reads every step before approving, and why I would not let a model talk to my son directly.","speaker":"source","section":"s03","para":16},{"start":407.505,"end":409.295,"text":"Small things that turned out to matter:","speaker":"source","section":"s03","para":17},{"start":410.505,"end":416.609,"text":"The hold button fires after 0.8 seconds, measured from timestamps, not animation frames.","speaker":"source","section":"s03","para":18},{"start":417.275,"end":420.465,"text":"Quick taps do nothing, and letting go early drains the ring.","speaker":"source","section":"s03","para":18},{"start":421.415,"end":435.235,"text":"Step timers come from timestamps too, so a throttled tab stays correct.?speed=20 in the address makes them twenty times faster, which is how the screen got tested without brushing anyone's teeth for a minute at a time.","speaker":"source","section":"s03","para":18},{"start":436.235,"end":444.485,"text":"Gemma once returned a colon as the \"emoji\" for both teeth steps, and my validator let it through: it only rejected letters and digits.","speaker":"source","section":"s03","para":18},{"start":444.975,"end":448.605,"text":"Now any plain ASCII there is rejected and replaced with a star.","speaker":"source","section":"s03","para":18},{"start":449.185,"end":451.915,"text":"The first voice the app picked sounded robotic.","speaker":"source","section":"s03","para":18},{"start":452.905,"end":464.71,"text":"It now uses only voices installed on the device, never a network one: Premium first, then Enhanced, then a short list of natural voices, and never the novelty voices macOS ships.","speaker":"source","section":"s03","para":18},{"start":465.415,"end":468.115,"text":"On the parent screen I can pick another voice and test it.","speaker":"source","section":"s03","para":18},{"start":469.165,"end":475.505,"text":"If I set a time to leave, the last screen says how long is left: \"You have 14 minutes to play before liftoff.\"","speaker":"source","section":"s03","para":18},{"start":476.795,"end":477.336,"text":"What I cut.","speaker":"source","section":"s03","para":19},{"start":477.855,"end":480.505,"text":"A speed comparison with the smaller gemma4:e2b.","speaker":"source","section":"s03","para":19},{"start":480.715,"end":484.341,"text":"It was not on the laptop, so I have no numbers for it.","speaker":"source","section":"s03","para":19},{"start":484.885,"end":487.435,"text":"It was one evening, and the kid screen got the time.","speaker":"source","section":"s03","para":19},{"start":488.665,"end":489.965,"text":"What is not tested yet.","speaker":"source","section":"s03","para":20},{"start":490.405,"end":496.745,"text":"It has run in a browser in tablet mode on my laptop, not on a real tablet, and not with the person it is for.","speaker":"source","section":"s03","para":20},{"start":497.715,"end":512.735,"text":"Speech voices differ between devices: for a natural one on a Mac or iPad, you download a Premium or Enhanced English voice in Settings > Accessibility > Spoken Content (Read & Speak on newer macOS), and the app picks it by itself.","speaker":"source","section":"s03","para":20},{"start":513.425,"end":518.62,"text":"I expect the timers to need tuning once a real six-year-old is holding the button.","speaker":"source","section":"s03","para":20},{"start":519.62,"end":522.262,"text":"For this project it is not a nice extra.","speaker":"source","section":"s04","para":0},{"start":522.78,"end":524.91,"text":"It decides whether I would use the thing at all.","speaker":"source","section":"s04","para":0},{"start":526.15,"end":528.88,"text":"The input is a description of where my child struggles.","speaker":"source","section":"s04","para":1},{"start":529.41,"end":531.41,"text":"\"Brushing teeth is the hardest part.\"","speaker":"source","section":"s04","para":1},{"start":531.89,"end":533.81,"text":"\"He only eats one thing for breakfast.\"","speaker":"source","section":"s04","para":1},{"start":534.3,"end":536.16,"text":"That is what I type into the box.","speaker":"source","section":"s04","para":1},{"start":536.58,"end":542.89,"text":"With open weights on my own laptop, those sentences go from my keyboard to my own memory and nowhere else.","speaker":"source","section":"s04","para":1},{"start":543.85,"end":548.25,"text":"I did not have to read anyone's privacy policy to decide that this was fine.","speaker":"source","section":"s04","para":1},{"start":549.49,"end":550.91,"text":"It does not need the internet.","speaker":"source","section":"s04","para":2},{"start":551.34,"end":556.75,"text":"The page, the Lexend font, the model and the saved missions all live on the laptop.","speaker":"source","section":"s04","para":2},{"start":557.31,"end":560.63,"text":"A morning routine should not depend on somebody else's uptime.","speaker":"source","section":"s04","para":2},{"start":561.86,"end":563.993,"text":"It costs nothing, so I can be picky.","speaker":"source","section":"s04","para":3},{"start":564.64,"end":567.43,"text":"I generated dozens of missions while tuning the prompt.","speaker":"source","section":"s04","para":3},{"start":567.94,"end":574.16,"text":"There is no meter running, no key to protect, and no account to create for a tool that a six-year-old uses.","speaker":"source","section":"s04","para":3},{"start":575.36,"end":577.11,"text":"Anyone can change how it thinks.","speaker":"source","section":"s04","para":4},{"start":577.58,"end":580.62,"text":"The system prompt is a text file in the repository.","speaker":"source","section":"s04","para":4},{"start":581.13,"end":583.5,"text":"The model is one line of configuration.","speaker":"source","section":"s04","para":4},{"start":583.93,"end":588.13,"text":"If your kid needs steps cut even smaller, you edit a paragraph of English.","speaker":"source","section":"s04","para":4},{"start":588.68,"end":592.845,"text":"For a family tool, local and open is simply the right shape.","speaker":"source","section":"s04","para":4},{"start":593.545,"end":610.09,"text":"Here is something to think about on the way back. Considering the system's reliance on a parent to approve every step, what does that reveal about the necessary level of human oversight when customizing a tool for a child's specific needs?","speaker":"app","role":"question"},{"start":611.49,"end":614.915,"text":"That's the end. You should be almost home.","speaker":"app","role":"outro"}]}
