Your handmade virtual pet

Open-source virtual pets for M5Stack devices — playful for kids, inspectable for parents and hackable for makers.

✨ The flagship pet, Muffin, hears you call its name and understands what you ask — fully offline, running its own small AI on a Module-LLM expansion.

M5

Try poking my forehead, cheeks or nose.

Three pets, one accessory

Same source tree. Pick the pet that matches your hardware — and optionally add a Pip as a pocket-sized companion device that pairs with any of them.

★ Flagship

Muffin

M5Stack CoreS3 + Module-LLM

  • Listens to its name + offline AI
  • Front camera + selfies
  • Web radio
  • Touch UI

Visu

M5Stack CoreS3 (no module)

  • Front camera + selfies
  • Web radio
  • Touch UI
  • Same hardware as Muffin, no LLM module

Goo-Goo

M5Stack Core2

  • Hard buttons (BtnA/B/C)
  • Web radio
  • Touch UI
  • Most affordable variant
Accessory

Pip

M5StickC PLUS2

  • Pocket companion for any of the three pets
  • Pick a treat (Apple / Carrot / Bone) with BtnA
  • Wrist-flick throws it via ESP-NOW
  • Home pet eats it within ~200 ms

Note: the pet illustrations above are stylised demos. Real screenshots from the actual hardware are below.

Pick your pet animal

Each pet renders one of three animals on screen — Bear, Cat or Dog. You pick during first-run setup; you can switch any time in Settings. Real screenshots from a Goo-Goo (Core2):

Bear
Bear
Cat
Cat
Dog
Dog

In real life

Pixel Pets family on a desk — Muffin, two Goo-Goos and a Pip
The whole family on the desk: Muffin (dog), Goo-Goo (bear), Goo-Goo (cat) and a Pip on the Tricks page.
Goo-Goo close-up showing the bear pet on a meadow scene
Goo-Goo close-up — the bear pet on a meadow scene, through a phone camera.

What you need to buy

Pick one pet kit, plus optionally a Pip as accessory. All from the official M5Stack store; no soldering, all USB-C.

Pets — pick one

Accessory — optional

What it does

😊

Eleven moods

Pip: 5 basics

Idle, happy, excited, in love, sleepy, asleep, sad, startled, laughing, eating, speaking — driven by needs and interaction. Pip has the basic five (idle / happy / excited / sleeping / startled).

🗣️

Voice control

Muffin only

Muffin listens for its own name. Call “Muffin!”, then tell it what to do — “eat something”, “let’s play”, “go to sleep”, “turn on the radio”, “let’s dance”. The pet understands plain sentences and triggers the matching action. Everything runs offline on a small built-in AI: speech-to-text by Whisper, intent classification by Qwen3-0.6B, both on the Module-LLM expansion. No cloud, no microphone leaving the device.

🎤

Singing + applause

All pets

Tilt the device upright, then left and right within five seconds — the pet bursts into song for eight seconds, then opens its ear and listens for applause. Loud clapping rewards a happy reaction; silence gets a small disappointment. The pet uses its built-in microphone to measure peak loudness.

👀

Proximity wake-up

Muffin / Visu only

The front camera runs a lightweight skin-tone detector. When you walk past or lean in, the pet greets you with a happy face and a chirpy sound — once per cooldown so it doesn't get annoying. The detector goes silent while the pet is sleeping, listening for voice or playing radio.

📷

Selfies + gallery

Muffin / Visu only

Open the camera in the media menu, the pet shows up in the bottom-left corner of the live preview. Tap the round shutter button on the right edge to capture; the gallery shows up to five photos as a thumbnail grid, tap a thumb to view it big with the pet alongside.

📻

Kid-friendly web radio

Muffin / Visu / Goo-Goo

WDR Die Maus on German, Fun Kids UK on English. The pet sways to the music with little notes drifting up. No tracking; the stations are public broadcasters.

🤝

Pet friendships

Muffin / Visu / Goo-Goo

Two pets in radio range can swap gifts, hearts, food and toys via ESP-NOW. Both kids tap a big “Verabreden” button at the same time to pair up, then the four send buttons appear. No internet, no accounts.

🎮

Mini-games

Muffin / Visu / Goo-Goo

Sport mode (squats, jumps, yoga via IMU), foraging for food, toy play with five toys, scene travel between bedroom, meadow, forest, beach, city, desert and space — each scene with its own activity.

🌤️

Real weather + moon

Muffin / Visu / Goo-Goo

The bedroom window mirrors your local weather and the night scene shows the actual moon phase. Location is resolved once via IP, then cached for a day.

Parental session limit

Muffin / Visu / Goo-Goo

Defaults to 30 minutes per power-on, configurable 5–120 minutes via a parent web page. After the limit the pet plays a bedtime animation and shuts down with a 30-minute lockout.

🎁

Treat thrower (Pip → home pet)

Pip + Muffin / Visu / Goo-Goo

Pip cycles through five pages with BtnA — an empty “pick one” safe-carry page, Apple / Carrot / Bone treats, and Tricks. On a treat page a wrist-flick throws it via ESP-NOW; within ~200 ms the home pet eats it with the matching face and a happy sound. No router needed; enable “Pip mode” in the home pet's Settings to receive.

Tricks (Pip → home pet)

Pip + Muffin / Visu / Goo-Goo

On the Tricks page each up-or-down flick of Pip counts a peak. After a short pause the count is sent to the home pet, which hops that many times in a row — laughing face, giggle sound and a heart per landing. The kid is teaching it a quick trick.

A father-and-son project

Pixel Pets was made together by Justus (10) and his dad Marcel. Justus brought the ideas, tested every build tirelessly and made the design calls — how the pet should feel, which mini-games belong in which scene, which animations stay. Dad's job was to “translate” this input for the AI doing the coding, and to add a bit of technical know-how on the side. The first beta was finished on a Sunday afternoon, sitting next to Justus on the sofa; the boring polish (CI, partition tables, README rewrites) was dad's evening work. Every line of firmware came from Claude (Anthropic) under our direction.

For parents

No cloud, no account

Everything runs on the device. The only network calls are an optional weather lookup and the kid-friendly web radio stream — both you can turn off.

Open source, you can read it

MIT-licensed firmware on GitHub. Every interaction the pet has is in the source. No hidden behaviour, no telemetry.

Built-in time limit

The pet decides when bedtime is. After the configured session length, it plays a sleep animation and shuts down — even if your kid wants “five more minutes”.

Quiet by default

Volume and brightness are configurable. The pet babbles softly when idle but never shouts; the wake-up sounds are short pet noises, not human speech.

Get started

  1. 1. Pick a board

    The most polished experience is on the M5Stack CoreS3 with the Module-LLM (Muffin). On a budget, an M5Stack Core2 (Goo-Goo) is enough. For a pocket-sized stick, get the M5StickC Plus 2 (Pip).

  2. 2. Clone the repo

    git clone https://github.com/marceld23/Pixel-Pets.git
    cd pixel-pets
  3. 3. Install PlatformIO

    Either as a VSCode extension or as a CLI:

    pip install platformio
  4. 4. Build and flash

    pio run -e cores3 -t upload         # Muffin (CoreS3 + Module-LLM)
    pio run -e visu   -t upload         # Visu   (CoreS3 alone)
    pio run -e core2  -t upload         # Goo-Goo (Core2)
    pio run -e pip    -t upload         # Pip    (StickC Plus 2)

    Detailed hardware notes (COM-port quirks, Module-LLM ADB workflow, Qwen3 pitfalls) are in the docs:

    docs/hardware.md · architecture.md · concept.md