A Hebrew/English toddler game for Android with פּוּקִי, a talking parrot whose brain (Gemma + BlueTTS + Hebrew Whisper) runs on your own PC. No cloud.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗A Hebrew/English Android game for toddlers (ages 2–4), with פוקי, a talking parrot whose brain runs on your own PC. No cloud, no ads, no tracking, and nothing ever leaves your home.
Website: tomsadeh.github.io/puki (Hebrew and English, with the latest download)
I made Puki because I got tired of toddler games that stop in the middle to ask for money. My daughter would get into a game, love it, and then a screen would pop up: pay, watch an ad, unlock the next level. A two-year-old can't understand any of that. All she learns is that the fun suddenly ends.
So Puki is free, forever: no price, no in-app purchases, no subscriptions, no "full version", no ads. It will never ask for money, and there's no payment code in it at all. The only thing that ends the fun is the time limit the parents set, and even that ends with a calm goodbye. It's open source (MIT), so nobody can ever lock it behind a payment.
The game: an island world with toddler-sized games, each in its own illustrated scene (a farm, a garden, a playground under a rainbow, a theater stage, a cozy house):
Toddler-first design: no reading needed, big tap targets, no failure states (wrong answers get a gentle shake and "let's try again"), and every line spoken in a warm voice. When the parent's time limit is up there's no countdown: evening falls over the game, Puki yawns and waves goodbye, and the music fades. Everything answers a touch: pieces squish when pressed, bob while they wait, and burst into stars when they're right. Hebrew instructions follow the child's gender (תלחצי / תלחץ), set in parent settings. All voice lines are generated offline with BlueTTS.
פוקי, the companion (optional). A parrot sits in the corner of the games. When it can reach a PC at home running the brain server:
On the PC, a small dashboard (http://127.0.0.1:8793, visible on that PC only) shows whether the brain is awake, the pairing code, and a live log of what the child said and what Puki answered.
Toddler tablets tend to be cheap and weak (this was built for a Galaxy Tab A7 Lite with 3 GB of RAM). A language model, Hebrew speech recognition and Hebrew TTS together need far more, so the tablet stays the screen and a PC on the home network does the thinking.
Or on a high-end phone. On a phone with about 12 GB of memory (tested on a Galaxy S25), Puki can think, talk and listen on the device itself, away from home too. In parent settings, "Puki on this phone" downloads the models once (about 4.6 GB: Gemma 4 E4B for LiteRT-LM, the BlueTTS voice and kol-stream's ears) and switches over. On the phone Gemma runs on the GPU (the first word in under a second), the voice takes about 0.6 s for a line, and the ears hear a word in about 0.6 s even on a slow tablet. For now it speaks Hebrew only there; English falls back to the recorded lines (the plan is Android's own offline voices, see the roadmap).
memory folder on your PC and is never sent anywhere. Recordings are never kept,
careful moments (hurt, scared) aren't logged, and "memory": false in config.json turns it off.a799cab5bcf83c20c754490f8d0eb271cf844e2b7e69518760789f2a96eb3c3d. Android only installs an
update signed with the same key as the installed app, so a changed Puki can't come in as an
update. To check a download: apksigner verify --print-certs Puki-<version>.apk.brain/pins.json
(Hugging Face files at a fixed commit, and every file's SHA-256), and refuses anything that
doesn't match, so a file changed upstream never reaches your PC.The app (Android Studio, or the command line):
./gradlew installGithubDebug
music_dance.mp3
when it's there (otherwise the main theme). To use your own, replace
app/src/main/res/raw/music_hub.mp3, music_night.mp3 and music_dance.mp3.Updates: the app updates itself from this repo's releases. When there's a newer version, a red dot shows on the gear; in the parent settings, tap Update. The first time, Android asks you to let Puki install apps (a switch on the next screen); after that, each update just asks you to confirm. Progress, stars and settings are kept. You can also install the APK from the releases page by hand.
The companion: on Windows, run Puki.exe from the
releases (or python brain\install.py from this
repo); on Linux, python3 brain/install.py. It downloads
everything (about 10 GB), sets up the firewall and autostart, and shows the pairing code; see
brain/README.md. Ideally the PC has an NVIDIA GPU with about 6 GB of free
VRAM (it falls back to the CPU otherwise).
Pair the app by scanning the QR code on the PC's dashboard (http://127.0.0.1:8793). The code
is also in ~/puki-brain/brain/pairing_code.txt, to type in with the PC's address instead.
Personal voice lines: the game can say the child's name ("כל הכבוד, ___!"). The first time the companion is reachable, Puki records these lines onto the tablet, so they also play when the PC is off. The name only ever lives on the tablet and your PC. To bake them into the app instead (they're git-ignored, so the name never ends up in a repo):
python scripts/generate_voices.py --bluetts-dir ~/puki-brain/BlueTTS --child-name "<name>" --child-gender girl
app/ Android app (Kotlin, Jetpack Compose)
brain/ companion server for the PC: doorbell.py (HTTPS front door),
brain.py + persona.py (Gemma, the voice, Whisper), tls.py
(its certificate), dashboard, install.py, pins.json (pinned
downloads; make_pins.py), tray.py / build_exe.py (Puki.exe)
scripts/generate_voices.py all voice lines, generated with BlueTTS
scripts/check_voices.py checks every voice line the app plays has audio
scripts/generate_instruments.py the music game's instrument sounds
scripts/release.py builds the APK and publishes it as a GitHub release
scripts/draw_companion.py draws the parrot
CLAUDE.md conventions for working on the code (also read by Claude Code)
generate_voices.py.app/src/main/java/io/github/tomsadeh/puki/brain/): LocalBrain answers the
same requests as the PC brain, with Persona (a port of persona.py's and brain.py's prompts and line filter) and Safety
(safety.py's nets),
voice/ (a Kotlin port of BlueTTS's pipeline, checked to match Python sample for sample),
Mind (Gemma through LiteRT-LM) and KolEars (kol-stream through ONNX Runtime; its ONNX files
come from train/kolstream_export.py). KolEarsBench in androidTest times it on a device:
gradlew connectedGithubDebugAndroidTest -Ppuki.bench installs it as a separate app.pukiVersion in app/build.gradle.kts, commit, then run
python scripts/release.py --publish from this checkout. It refuses if personal voice lines
(voice_*_name*) are in res/raw, so a release never carries a child's name, and if the APK
is signed with the debug key (releases use the key in ~/keys, see app/build.gradle.kts).
When the PC side changed, also build Puki.exe (python brain/build_exe.py) and attach it:
it carries its own copy of the brain's code../gradlew testGithubDebugUnitTest, python -m pytest brain/tests and
python scripts/check_voices.py (CI runs all three). On a device, the debug build's
self-test: adb shell am broadcast -n io.github.tomsadeh.puki/.SelfTestReceiver
(adb logcat -s PukiSelfTest), with -e host <ip:port> -e code <CODE> -e pin <fingerprint>
to check the HTTPS connection to a PC, -e timelimit 1 to see the goodbye after a minute
(0 turns it off again), or -e echotest 1 for the parrot voice.brain/install.py, run
python brain/make_pins.py and commit the new pins.json.voice_lines in scripts/generate_voices.py, generate it,
then run scripts/check_voices.py.Models are downloaded separately and are not part of this repository.
A sticker moment and a progress page for the parent; English and a faster start for the phone brain; games that feel better; a few more small toys. Puki's memory, which stays in your home, has started: he keeps a diary of playing and remembers yesterday. See ROADMAP.md.
Pull requests are welcome. The rules come from the audience: no failure states, nothing the child has to read, big targets, both languages, and nothing that leaves the home. See CONTRIBUTING.md for what gets accepted and what a PR needs to show.
MIT. Built with lots of help from Claude Code.