A Raspberry Pi 2 appliance image that boots directly into a toddler-proof pygame smasher. Press a key → get a big colored letter + a sound. Hold Ctrl+Shift+Alt for 2 seconds to open the parent menu.
Design goals: toddler-proof, power-yank resilient (overlay FS), audio-first, boots in under 20 seconds, no post-flash setup.
python3.11 -m venv .venv && source .venv/bin/activate
pip install -r requirements-dev.txt
pytest # unit tests (headless)
python app/main.py # run the app locally (SDL dummy/x11/cocoa)Requires Debian Bookworm host + Docker (the pi-gen build uses sudo +
loop devices). Dev + tests run on macOS; the image build runs on the
Debian VM mypalclarissa.
just build # → pi-gen/deploy/image_*-ToddlerSmash.img (.zip)
just qemu # optional: boot in QEMU raspi2b (Linux only)
just flash /dev/sdX # WARNING: flashes the SD at /dev/sdXlsblk # find SD card device
sudo umount /dev/sdX* # unmount if automounted
sudo dd if=pi-gen/deploy/image_*-ToddlerSmash.img \
of=/dev/sdX bs=4M status=progress conv=fsyncOr use Raspberry Pi Imager's "Use Custom Image" option.
Hold Ctrl + Shift + Alt for 2 full seconds to open the parent menu. Up/Down to move, Enter to pick a mode or Quit, Esc to resume.
docs/toddlersmash-spec.md— full build specificationdocs/plans/— implementation plans
.
├── README.md
├── build.sh # top-level build driver
├── config # pi-gen top-level config
├── justfile # common targets
├── app/ # Python app source
│ ├── main.py
│ ├── engine/ # synth, asset_bank, mode_manager, parent_hotkey
│ ├── modes/ # base + keyboard + stubs
│ └── assets/
├── stage-toddlersmash/ # custom pi-gen stage
├── tests/ # pytest suite
└── infra/
├── apt-cache/ # optional apt-cacher-ng compose
└── qemu/ # no-hardware boot testing