Chat Toys
One overlay. Follows, subs, and the other stream events either put an animated character on the bottom of the screen, toss an emote into a bouncing wall, or do both. A chat message puts a speech bubble on a walker who is already there. Chat can dress their own walker, and that look is kept for the next stream.
Setup
- In Streamer.bot, turn on the WebSocket Server. YouTube and Kick only arrive as Streamer.bot events, so those platforms have to be connected there.
- Open the customizer, copy the import string, then Streamer.bot → Actions → Import. The action is “ZeMaxi - Chat Toys”.
- Set the mode, platforms, lifetimes, and the toss reward. Click Generate and copy the overlay URL.
- In OBS, add a Browser Source at 1920×1080 with a transparent background. Paste the URL.
- Optional: add the dock URL as another browser source, or open it on a second screen.
Modes
The URL carries mode=walk, mode=wall, or mode=both.
- Walk. Each event puts that person’s character on the floor. They play a walk cycle, face the way they are going, bounce off each other, idle for a moment when they turn at the edge, and leave after the idle timer you set. There is a cap for how many can be on screen. One person has one walker. Another message from them resets the timer instead of adding a second copy.
!jumpand!toss(or the reward name, default Toss) make their walker jump.!waveplays a short emote. If they are not on screen yet, the command puts them on screen. - Wall. The same events drop a ball into the frame. The ball holds the emote from the message, or a letter chip when there is none, and its rim takes the event colour. Balls squash when they land, roll, stack, come to rest, and fade. Bigger events make bigger balls: follows are a little larger, subs, members, and rewards larger again, gift subs larger still, and Super Chats, Kicks, and Jewels grow with the amount. Big balls sparkle while they fly. A gift bomb drops one ball per gift, up to 10. A mod command, default
!clearwall, clears the wall. The dock has the same button. - Both. Walkers and the wall run together. Walkers shove balls along the floor as they pass, and a ball that drops on a walker’s head bounces off while the walker flinches.
Speech bubbles
A chat message puts a pixel speech bubble over that person’s walker when they are already on screen. The bubble follows them, jumps with them, starts small, and pops up to full size. Emotes in the line show as pictures, so “Hello there zemaxiCool” keeps the words and the emote. It stays for the number of seconds you set, then shrinks away. A newer message from the same person replaces it. Commands such as !skin do not get a bubble. Wall-only mode has no walkers, so it has no bubbles. Colours: white, sky, pink, gold, mint, lilac, and ink. White is the pixel bubble with a blue edge.
Chat commands
Each command can be turned off in the customizer. !jump is always accepted alongside whatever you type in the jump-command box. !colour works the same as !color.
!walkersor!walker— list the commands. It points at!skinsfor the character names.!skins— the names you can use, split by group. A long list is sent as more than one message so it stays under Twitch’s 500-character limit.!skin frog— pick a character. The original names still work:frog(Ninja Frog),dude(Mask Dude),pink(Pink Man),guy(Virtual Guy), plus the rest of the cast (see!skins), such asfox,toad,cat,blob,parrot, andgreenie.!skin randompicks one of the skins the channel has turned on.!skin defaultgoes back to the channel default.!color blue— tint. Names: red, orange, gold, green, teal, blue, purple, pink, gray. A hex works too, such as!color #33ccff.!color noneclears it.!hat crown— crown, cap, flower, horns, halo, bow.!hat nonetakes it off.!jumpor!toss— hop. The named channel-point or Kick reward still does this.!wave— play the wave emote.!dance— hop, wave, and spin around for three seconds.!hug name— your walker and theirs walk to each other and share a heart. Both need to be on screen, or yours is put on screen.!kick— your walker runs to the nearest ball and boots it across the screen. Needs the wall.!shake— mods and the broadcaster only, at most once every 10 seconds. Every ball jumps, every walker hops, and the frame shakes.!walker random— new skin, colour, and hat together, from the skins that are turned on.!walker frogis a short way to set a skin.!walker dance,!walker hug name, and!walker kickwork too.
The choice is stored on that person’s platform id inside the persisted global zmx.chat-toys.state, under looks. It survives the walker leaving and the overlay closing. A copy is also kept in this browser’s localStorage, and the two are merged, newest edit first. Nothing is sent to a database. Chat replies need the Streamer.bot websocket password, the same as the other tools. Turn replies off in the customizer if you want the change with no message.
Mods still clear the wall with !clearwall (or the command you set).
Skins and groups
The customizer lists skins in sections, one per source. Every one is free CC0 pixel art:
- Pixel Frog — Pixel Adventure 1 and 2, Kings and Pigs, Pirate Bomb, and Treasure Hunters. A pack name is only a heading.
- Sunny Land —
fox,toad, andpossum, by ansimuz. - Kenney — the Pixel Platformer cast:
greenie,bluey,cyclops,goldie,spacer,grumpy,drill,crawler,flapper, andbuddy. - OpenGameArt —
blob,cat,parrot,hawk,worm,wasp, andchomp.
Turn a whole group off, or one skin, and click Generate. !skin random and !walker random use whatever is still on. A look someone already saved keeps working when that skin is still on. A saved skin that no longer exists falls back to the channel default. The Pixel Adventure 2 mushroom is mush. Every character faces the way it walks; the Pixel Frog enemies were drawn facing left and are mirrored.
Adding a sprite sheet
Skins are listed in sprites/manifest.json. Every sheet uses the manifest frame size, which is 32×32. A strip is a horizontal row of that many square cells, left to right, no padding between cells. The character faces right. The feet stand on the bottom row of the cell so every skin shares one floor line. walk is required. idle, jump, fall, and wave are optional and fall back to the walk strip. Put the files under sprites/, add the skin, and reload the overlay. Hats are separate images; the manifest lift value drops or raises one on the head. Art credits and licences are in CREDITS.md.
Give your own art its own group. fps is per animation. Optional motion is float (a small bob above the floor while walking or idling) or squash (alternate walk frames flatten, feet staying down). Raise the manifest version when you redraw a sheet under the same file name, so browsers and OBS fetch the new picture. This is the whole entry:
{
"id": "mio",
"name": "Mio",
"group": "custom",
"pack": "Custom",
"aliases": ["mio"],
"motion": "float",
"animations": {
"idle": {"file": "sprites/custom/mio/idle.png", "frames": 8, "fps": 10},
"walk": {"file": "sprites/custom/mio/walk.png", "frames": 8, "fps": 12},
"jump": {"file": "sprites/custom/mio/jump.png", "frames": 1, "fps": 1},
"fall": {"file": "sprites/custom/mio/fall.png", "frames": 1, "fps": 1},
"wave": {"file": "sprites/custom/mio/wave.png", "frames": 6, "fps": 12}
}
}
Add the group to groups in the manifest:
{ "id": "custom", "name": "Custom" }
Platforms
Choose All, one platform, or any pair. A Twitch simulcast that is not allowed to show other platforms on screen can be set to Twitch only. Walkers are the sprite characters, not profile photos. The wall still uses an emote from the message when there is one. Chat Toys does not call the Twitch API.
Events
Follows, subs, gift subs, Kick subs, Kicks, Super Chats, Super Stickers, Jewels, memberships, Twitch raids, and Twitch channel-point or Kick reward redemptions. Each one can be turned off. A raid rains balls with the raider’s Twitch picture, one for every five viewers (3 to 12), and the raider’s walker jumps in. A chat message does not spawn a toy. The toss command and the named reward still jump a walker when reward spawn is off.
Dock
Clear wall, pause spawn, test toss, shake, and test rain. Shake does what !shake does. Test rain drops a raid’s worth of balls. Pause stops new toys from events. Toys already on screen finish their lifetime. Test toss still jumps a walker so you can see the overlay without waiting for chat.
Where it is saved
The overlay and the dock share one persisted Streamer.bot global, zmx.chat-toys.state, written by the imported action with CPH.SetGlobalVar(..., true) and broadcast with CPH.WebsocketBroadcastJson. Walker looks live in that same global. You do not need a new import if “ZeMaxi - Chat Toys” is already there. Nothing is stored in an outside database. The customizer remembers the form in this browser only. That form is not the show.
Preview
The customizer preview uses ?preview=1. It does not connect to Streamer.bot. It keeps a demo cast walking and listens for the test buttons. Live overlays still despawn idle chatters on the timer you set. The real overlay shows “Streamer.bot disconnected” and hides that note after 5 seconds.