I built the Mother Goose tab on 13 October 2026. This happened on 21 October, eight days later.
The Need: One Book Without a Song
The tab holds 19 songs, one for each board book in a set we were given. Each book has a cover, a video, an audio-only mode, synced lyrics, and a photo of the book’s translation page.
The physical set has 20 books.
My daughter is three. She can’t read the titles. But she told her mother that the Muffin Man book was in the pile and had no song in the tab. Her mother was surprised. Out of 20 books, how did she know which one was missing?
I don’t know. My guess is that she knows the books by their covers (this one has a lion in a chef’s hat), and she had been going through the tab song by song, picture by picture. A small thing like that is easy to miss as an adult and hard to miss as a three-year-old with a phone.
So I added it right away.
The Proof: Twenty-Four Minutes
The prompts are in my coding history with timestamps:
- 12:58, I asked Claude to clean the margins of the cover scan, name the book, and find the matching video first.
- 13:12, I gave it the video file I had prepared and asked it to cut the intro and the ad at the end, like the other episodes.
- 13:22, I wrote back that it worked.
Now the tab has a 20th card, “The Muffin Man”, with a trimmed 65-second video, an audio mode, subtitles with Korean translation, and the book’s own translation page. Nothing has a “generate” button. The lyrics and translations were made in advance and stored on the NAS, because the person holding the phone is three.
The Story: Why the Intro Gets Cut
The original video starts with 12 seconds of channel logo and title card, and ends with a “watch more” card and a black screen. In a tab my daughter uses alone, those are the parts she could tap into by accident. The ending card is also an invitation to leave the app. So every episode has had both cut off since the first one.
💬 Prompt that worked “Please cut the intro at the front and the ad at the back of this video, the same way as the other episodes.”
That is short because the other 19 episodes already exist. Claude read the project notes, saw how the earlier ones were trimmed (cut the intro and ending card, fade out the last half second, keep the original), and applied the same rule. I did not have to explain it again.
One more detail. I did not ask Claude to fetch the video. I asked it to find the right address first, and I made the video file myself. It listed candidates from the same official channel as the other 19 and pointed out one that was a re-upload by a different channel, which I skipped. Picking the right source was my decision. That felt right.
The How
1. Find where the song really starts. I did not guess the cut points. I looked for scene changes and silences:
ffmpeg -i in.webm -vf "select='gt(scene,0.35)',showinfo" -af silencedetect=n=-45dB:d=0.4 -f null -
This printed the times where the picture changed a lot. There were cuts at 10.2 s and 12.2 s. I then pulled frames around those times and put them side by side. The frame at 11 s showed the title card, and at 13 s the first lyric line was already on screen. So the song starts at 12.17 s.
2. Find where it really ends. blackdetect found a black stretch from 77.37 to 78.23 s. The “watch more” card came after that. A frame at 76.4 s still showed the character in a circle closing in, which is part of the song. I ended at 77.2 s.
ffmpeg -ss 12.17 -to 77.2 -i in.webm \
-vf "scale=1280:720,fade=t=out:st=64.5:d=0.5" -af "afade=t=out:st=64.5:d=0.5" \
-c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p -c:a aac -b:a 128k \
-movflags +faststart video.mp4
The result is 65 seconds, 11 MB. The audio-only file is pulled from the trimmed video, so it matches exactly.
3. Clean the two scans. Each scan is a full A4 page with the book placed in the top-left corner, and gray scanner background on the right and the bottom. For the cover I found the colored area (saturation threshold) and cropped to it. For the translation page I used the brightness of the white page and cut off a green sliver of the next page on the right. I checked both on a contact sheet before copying, and trimmed 12 more pixels from the page because the sliver was still visible. Final cover: 1768 × 2446, thumbnail 400 px wide.
4. Add the folder. The tab is folder-based, with no database. The folder 20 The Muffin Man with five files (video.mp4, audio.mp3, cover.jpg, thumb.jpg, page.jpg) was all it took. The card appeared in the API list immediately. The server did not need a restart.
5. Pre-generate the lyrics. Two POST calls to my own server do it: one to transcribe, one to translate. After that I checked that all 23 lines had a Korean translation. They did.
🗂 Claude.md Rule For every new English song, the task isn’t done until the lyrics and Korean translation are generated and cached on the NAS. “Added” without a translation doesn’t count.
This rule was already in the project from an earlier mistake. This time it saved a step, because Claude ran the generation itself without being asked.
What Is Not Perfect
The transcript has a few lines that are not in the book. The video has spoken parts before and after the song (“Hello, everyone. I’m the muffin man…”), and the transcription kept them. So the lyrics screen and the book’s translation page don’t match line for line. I think this is fine for a three-year-old, but I may trim the lyric lines later.
I did not check the billing for the transcription and translation calls of this single song. Going by the earlier episodes, I think it is a few cents at most. I’ll add the real number after the month-end bill.
Cost for the tools: $0. They are ffmpeg, Python with Pillow, and a server I already run.
One Last Thing
I like building things for a user who tests the product every day and doesn’t know she is testing it. A missing song is a bug report that arrives with no ticket. This one cost me 24 minutes, and it was the best kind of review.
The video file itself and the book’s pages are for her private use and I am not sharing them here.