yotoshelf
YotoShelf is a self-hosted tool for making Yoto Make Your Own audio cards: record a reading in a browser tab, draft and voice stories, print labels, publish to the household’s Yoto account. Three repositories under gitlab.com/yotoshelf, unaffiliated with Yoto Ltd, written and maintained by a language model under go-architecture-for-llm-maintained-codebases.
- yotoshelf.dev: documentation and design tokens.
- yotoshelf: the app, Go server, Astro and Svelte front end.
- go-yoto: the Go client; every publish goes through it.
Recording happens in the tab.
- MediaRecorder captures the microphone behind a noise-suppression AudioWorklet, posting short chunks.
- The server pipes them into ffmpeg writing FLAC.
- Finishing transcodes to M4A; trim, split, merge and fade are background jobs.
- Publishing is another job, through go-yoto.
Three aids send content to a third-party provider, so an admin can turn them off instance-wide:
- a story drafter, from a prompt and a story profile;
- text to speech;
- an image model for icons and covers.
Labels: cover art and title in a grid of cells with crop marks, a PDF for adhesive laminate. A share link is a tokenized public URL to the label file, no audio.
Yoto publishes a spec and nothing else; go-yoto, standard library only, carries the rest.
- Weekly, CI publishes, reads back and deletes a card, capturing responses.
- Captures are the fixtures; a diff fails the job, never rewrites them.
yototestserves them, so tests drive the real client.docs/api-quirks.mdlists each difference from the spec, dated, with what the library does; a quirk found in the app lands there, never an app-side workaround.
Guardrails for the model maintaining it:
AGENTS.md: failing test first, one change per commit, never edit a test to pass.- Generated API and database types;
check:generatedfails on a diff. - Gates: 400 lines a file, no English outside the catalogue, no raw
fetchoutside the generated client.
Sharing stays in one instance: a collection’s owner, contributors and viewers.