Emoji Bot


February 3, 2019

EmojiBot is happy, unless he isn't. You choose. A chat-controlled robot that lets viewers create faces and animated expressions during live-streams. It's like Mr Potato Head...except completely different.

Make faces during live-streams.

In Development: Prototype 2

Final Release 75%

Reproduction plans (CC BY-SA) and limited release prototypes will be available after final.

Some products purchased through links may earn me a small commission to help fund further inventing to share with you. Thank you for your support.


EmojiBot is my first interactive, chat-controlled robot to let viewers physically interact with live-streams. It's a simple 5 servo system that would let viewers change the eye, brows, and mouth positions to make expressions using simple IRC chat commands.

Each part can be independently positioned and animated. 

The trickiest part was mapping the eyes/mouth to 360o and positioning the gear interface correctly.

He's not always happy.

There are many ways to do this. I chose the NodeJS+Arduino route.


  • Used NodeJS with wired Arduino UNO as it was the fastest, easiest, best documented, and most accessible solution for people.
  • To get full 360o rotation from the 180servo motors I used 2:1 printed spur gears.
  • Body parts were created using lasercut 1/4" MDF with a removable front/back panel.
  • Used some salvaged parts (legs & eyeballs) to speed up development for the first POC and PROTO1.
  • Uno is powered via USB cable, so only need external 6V supply for servos.
  • To interface with an IRC other than Twitch, you'll need to replace the tmi module with a module designed to interface with other IRC. You'll also have to write interface functions to map the new module to the bot code.


Notes on controlling EmojiBot. Select a tab to learn more. All commands can be pasted directly into the live-stream chat field.

!eb1.[part abbreviation][degrees]

Part Abbreviations:

  • Right Eye: re
  • Left Eye: le
  • Both Eyes: es
  • Mouth: m
  • Right Brow: rb
  • Left Brow: lb
  • Both Brows: bs

Degree Ranges:

  • Right Eye: 0-360
  • Left Eye: 0-360
  • Both Eyes: 0-360
  • Mouth: 0-360
  • Right Brow: 0-180
  • Left Brow:0-180
  • Both Brows: 0-180


  • !eb1.re145 (move right eye to 145 degrees)
  • eb1.le45 (move left eye to 45 degrees)
  • !eb1.m190 move mouth to 190 degrees)
  • !eb1.es45 (move both eyes to 45 degrees)
  • !eb1.rb180 (move right brow to 180 degrees)
  • !eb1.lb0 (move left brow to 0 degrees)
  • !eb1.bs30 (move both brows to 30 degrees)
  • You may "stack" up to 5 part commands to create a custom face in one command. For Example: !eb1.re35.le160.rb75.lb130.m90

Scripted positions for parts:


  • Random Face: !eb1.random


  • Eyes Left: !eb1.esleft
  • Eyes Right: !eb1.esright
  • Eyes Up: !eb1.esup
  • Eyes Down: !eb1.esdown
  • Eyes Right-Up: !eb1.esrightup
  • Eyes Right-Down: !eb1.esrightdown
  • Eyes Left-Up: !eb1.esleftup
  • Eyes Left-Down: !eb1.esleftdown
  • Eyes Inward: !eb1.esin
  • Eyes Outward: !eb1.esout


  • Brows Left: !eb1.bsleft
  • Brows Right: !eb1.bsright
  • Brows Up: !eb1.bsup
  • Brows Flat: !eb1.bsflat


  • Mouth Up: !eb1.mup
  • Mouth Down: !eb1.mdown
  • Mouth Left: !eb1.mleft
  • Mouth Right: !eb1.mright
  • Mouth Right-Up: !eb1.mrightup
  • Mouth Left-Up: !eb1.mleftup
  • Mouth Left-Down: !eb1.mleftdown
  • Mouth Right-Down: !eb1.mrightdown


  • Stacking commands is not supported for positions for now.

Scripted expressions you can invoke:

  • Crazy: !eb1.crazy
  • Happy: !eb1.happy
  • Sad: !eb1.sad
  • Mad: !eb1.mad
  • Scared: !eb1.scared
  • Surprised: !eb1.surprised
  • Disgust: !eb1.disgust
  • Confused: !eb1.confused
  • Terror: !eb1.terror
  • Anticipation: !eb1.anticipation
  • Smug: !eb1.smug
  • Devious: !eb1.devious
  • Drunk: !eb1.drunk


  • Stacking commands is not supported for expressions for now.

Scripted animations you can invoke:

  • Look Left: !eb1.lookl
  • Look Left-Down: !eb1.lookld
  • Look Right: !eb1.lookr
  • Spin Eyes same direction: !eb1.spin
  • Spin Eyes Opposite: !eb1.spino
  • Cat Clock: !eb1.catclock
  • Confused: !eb1.confused
  • Wiggle Brows: !eb1.wigbs


  • Stacking commands is not supported for animations for now.

Twitch Only

Invoke these emotes in chat and watch EmojiBot's face emulate the emote.

  • FeelsBadMan
  • FeelsGoodMan
  • PogChamp
  • Kappa
  • TriHard
  • 4Head
  • cmonBruh
  • LUL
  • haHAA
  • MrDestructoid
  • gachiGASM
  • laboraSnax
  • laboraIdea
  • labora8ball


  • Only the first Emote encountered in message is triggered.

Design notes on each version of EmojiBot. Select a tab to learn more.

Last Updated: October, 2022


  1. Create editor to build faces and animations. Thinking JQuery+rotation library to pivot parts
  2. Need a queue to make sure all submissions are processed and don't interfere with each other
  3. Build a mini EmojiBot (Ebot Jr) that is easier for people to reproduce:
    1. Fully 3D printed parts
    2. Swappable eyes, mouth, brows so they can be customized
    3. Independent of computer: use wireless RPi0W or ESP8266 or Arduino+ESP-01. Raspberry Pi preferred but at this time there is a parts shortage so may need to pivot to another MCU.

Built a laser-cut housing with a removeable front and back plate for servicing and added legs. The legs were salvaged from old overhead projection systems that I bought from an electronics recycle center. Here you can see I am starting to rough in the antenna/indicator. Planning to paint the bot "Twitch purple" or similar.


  • Bushings I designed are Okay, but should be swapped for bearings to avoid wear on servos. 
  • Moved to metal-gear servos except for eyebrows which are direct drive.
  • Still need to build an editor to push the bot to the next level.
  • I added scripts to react to follows, subscribers, and raids. 


I used a cardboard box with lots of hot glue to quickly hack together a proof of concept to play with. I knew early on I needed to focus on the backend (nodeJS) so didn't want to get caught up in the "prettiness" of the bot.


  • The lopsided mouth shape was intentionally designed so that one shape can emulate happy, mad, and surprized depending on position. 
  • Poorly interfaced spur gears will lead to premature failure of the servos. I will address this in Proto1.
  • Without an editor to generate the commands, viewers do not like taking the time to script part positions and animations. I should address this in Proto2.
  • I wrote some scripted animations, expressions, and positions to make it easier for viewers to play with the bot. The favorite script is one that generates random faces.

More Goodies