Skip to content
andrew.dunn.dev

yotoshelf

Source go-yoto Docs Quirks ledger go-yoto tags

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.

submoduleimportspublishesDOCS + DESIGNyotoshelf.devguides, API referencetokens, llms.txtAPPyotoshelfGo, Astro + SvelteSQLite, one containerCLIENTgo-yotono dependencies, PKCEtyped errors, drift guardsAPIYotospec,no docs
Three repositories and the publish path

Recording happens in the tab.

BROWSERMediaRecordernoise suppressionchunksSERVERffmpegstdin to FLACfinishTRACKM4Atrim, split,merge, fadejobJOBpublishthrough go-yotocardAPIYoto
Recording path from browser tab to published card
  1. MediaRecorder captures the microphone behind a noise-suppression AudioWorklet, posting short chunks.
  2. The server pipes them into ffmpeg writing FLAC.
  3. Finishing transcodes to M4A; trim, split, merge and fade are background jobs.
  4. 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.

APIYotoliveWEEKLY CIcaptureupload, read back, deleterecordsTESTDATAcaptured responsesdiff fails, never rewritesservesSTAND-INyototestdrives the real clientLEDGERdocs/api-quirks.md: behaviour, evidence date, handling • app-found quirks land here first
go-yoto capture and quirks ledger loop
  • Weekly, CI publishes, reads back and deletes a card, capturing responses.
  • Captures are the fixtures; a diff fails the job, never rewrites them.
  • yototest serves them, so tests drive the real client.
  • docs/api-quirks.md lists 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:generated fails on a diff.
  • Gates: 400 lines a file, no English outside the catalogue, no raw fetch outside the generated client.

Sharing stays in one instance: a collection’s owner, contributors and viewers.