Skelly Studio
ULTRA SKELLY V2 · ESP32 BLE
View GitHub ↗
BUILD YOUR OWN AUTONOMOUS SKELLY

Make your Skelly
come alive.

Pick a personality, choose his moves, and make the night a little stranger. Your ESP32 takes it from there.

Runs on its own after setupNo Wi-Fi or accountCustom movement, eyes & lights
START HEREYour first autonomous routine

Choose Subtle for a spooky head turn every 1–2 minutes. No wiring to the prop is needed.

  1. Use a 6.5-foot Ultra Skelly v2 and an original ESP32-WROOM. Other models are unverified.
  2. Open Send to your ESP32, install universal firmware once, then save your routine over USB.
  3. Power Skelly in Bluetooth mode and disconnect other controllers. Watch a complete head animation.
  4. Add arm, torso, eyes or lighting to make the routine your own.
01

Choose a personality

Starting points; customize below
02

Body movement

Intervals are start-to-start
Head movementTurns for about 25 seconds
Torso movementTurns for about 25 seconds
Arm movementTwo motions over about 22 seconds

Move selected motors together with one command. Waits for the current movement's full cooldown before starting.

Combination choices and timing

Randomly choose from these allowed combinations (all selected motors must be enabled above):

If mouth is enabled, keep body protection ON and jaw-first reactions OFF.

Eye expressionsOff · preview your chosen expression
Use selected eye expression

Keep one expression, or switch randomly between selected designs. When off, Skelly keeps its stored eyes.

Eye pattern 1 enlarged preview
Eye pattern #1

Open the options below to choose an expression or build a random rotation. Preview buttons enlarge designs without changing your selection.

Selected: eye #1 · fixed
Choose expressions & switching

Choose at least one design. In fixed mode, selecting another replaces the current choice.

Eye previews are included for offline use. Source attribution is included with the project.

LightingOff · body and head colors
Use selected lighting
TorsoHeadCustom colors
Adjust colors & effects

Torso

Head

Effects and brightness apply to all palettes in this scene.

Lighting is off.

Lighting help

Palette buttons choose one look and stop rotation. Edit a palette to change its saved colors or link Head to Torso. Rotation uses those saved colors; effect and brightness controls apply across the scene. When lighting is off, Skelly keeps its stored lighting.

Scene builderSave a complete look, or rotate a few throughout the evening

Editing a new scene

Browser library · 0 of 4 scenes

ESP32 · connect and read to compare

Edits stay here until saved as a scene or sent to the ESP32.

No custom scenes saved.

Start with a complete look

Each look replaces movement intervals, eyes and lighting. Customize above, then save. All start at 10 minutes with mouth off.

Up to four scenes · saved in this browser
Compare saved scenes
Saved browser scenes · editor drafts are excluded
SceneMinutesMovementEyesLighting

Routine preview

Saved scenes · sample requests within each hold

Save your first scene using the controls above.

Scene timing help

Each scene starts its hold when Bluetooth connects. Switching waits for current actions and full cooldowns, then reconnects with the next scene. Scenes do not advance while disconnected. Random starts with the first scene and avoids immediate repeats.

USB

Send to your ESP32

Install universal firmware once, then read and save settings here. Your routine runs on its own after USB disconnects.

Computer → ESP32Not connectedUSB connection
ESP32 → SkellyUnknownBluetooth connection

Connect USB to check Skelly.

Active scene—

Connect to identify installed firmware.

No controller status received yet.

Connect your ESP32 to read or save settings.

Save this routine sends the settings you’re editing above. No scene is needed. Save scene collection sends the saved collection from Scene builder. Both replace the ESP32’s current program; neither installs firmware.

New ESP32? Start here · install firmware once

Connect ESP32 → Install Firmware → Configure Skelly. Use the browser installer; no Arduino software, manual package download or GitHub account needed. Available release: 2026.10.24-preview.2. What changed →

Install universal firmware in your browser →

Original ESP32-WROOM with 4 MB flash · desktop Chrome/Edge · USB data cable. Installation overwrites ESP32 firmware and saved settings/scenes: back up first. Browser flashing remains physically Untested.

  1. Connect: plug the ESP32 into your computer; close other serial apps.
  2. Install: follow the browser installer, wait for completion, then close its dialog.
  3. Configure: return here, Connect ESP32 and wait for Ready. Choose your settings, confirm replacement, then Save this routine. Scene builder is optional. Wait for read-back verified before unplugging.

Already installed? Connect above and read saved settings before editing an existing setup. Ordinary settings changes need no firmware reinstall. Saved USB settings take priority over the factory Subtle routine.

Advanced Arduino fallback · source download

Download the model-specific universal source, open it in Arduino IDE, select ESP32 Dev Module and Arduino-ESP32 3.3.12, then compile/upload. Close Serial Monitor before connecting here.

Advanced & testingIdle breaks, clock, diagnostics and experimental audio
USB diagnostics & recovery

These are the last reported controller values. They do not confirm physical movement. Clock time is only needed when a scheduled window is enabled.

Restoring defaults uses the replacement confirmation in Send to your ESP32.

If identification stalls, close other serial apps/tabs and use Retry identification above. If needed, press EN/Reset once and retry. To diagnose separately, disconnect Studio, open Arduino Serial Monitor at 115200 / Newline, then send SKELLY HELLO and SKELLY STATUS. Close Serial Monitor before reconnecting Studio.

USB tools: clock, raw capture & package installer →

Idle breaksOff · pauses between routines

Idle breaks

Occasional quiet stretches after animations finish. Hardware integration is still untested.

Connection & diagnostics

Experimental device compatibility

Only the 2026 app-controlled 12-foot model with Bluetooth animation hardware is eligible. Older 12-foot models are excluded. Changing models resets eyes and lighting to OFF and removes unsupported settings.

The first-time installer and universal source download follow this selection. The experimental model uses its own restricted firmware; it cannot use Ultra USB records.

No Bluetooth MAC address to enter! The ESP32 automatically discovers the address by scanning for this name. Only change it if you renamed your Skelly.

Bluetooth scan retries

Each scan takes up to five seconds. Startup timing includes the scan, so a full missed scan can retry immediately. Faster startup retries end after the first connection or startup period. Later reconnects wait the normal pause after a miss or failure. Motor cooldowns stay unchanged.

Optional local clock schedule · experimental

Set local time through USB tools after every restart. Until then, no routines start. Overnight windows belong to their start day. Existing movement finishes at closing time. No Wi-Fi, automatic DST adjustment or clock retention after power loss.

At 115200 baud, records BLE write results, heap, connection attempts and lighting progress. Boot/reset information and event timestamps are always logged. Lighting test and log instructions ↗

Audio scenes EXPERIMENTAL · OPTIONALUpload a clip, choose its look, then schedule it

Let a stored clip take over movement, eyes and lights, then return to your regular routine. Audio plays on Skelly. This new workflow needs an attended first test.

Before connecting · direct Bluetooth setup
  1. Unplug the ESP32’s power and disconnect phone/web controllers. Close Studio’s USB session.
  2. Power Ultra Skelly v2 in Bluetooth mode. Connect below directly to Skelly.
  3. Upload an MP3 or select a stored file, save its look, then choose Use clip in routine.
  4. Disconnect Skelly here, power the ESP32 again, and save your routine over USB. Audio scenes need the updated universal firmware.

Files live on Skelly, not the ESP32. Preparing audio needs no account or cloud service. Files are never deleted or overwritten here. Cancel disconnects Bluetooth; a partial upload may remain.

Browser → Skelly Not connected

No Bluetooth connection opens until you choose Connect.

Prepare or trim audio · on this computer

Choose a browser-supported audio file (up to 12 MiB / 10 minutes). Trim up to 117 seconds and convert locally to Skelly's MP3 format. No account, upload or automatic playback.

Choose audio to prepare on this computer.

Local encoder: LAME / lamejs 1.2.1, LGPL. Source & notices. Audio is not stored in profiles.

Upload a new MP3

Prepared 8 kHz · mono · 32 kbps MP3, up to 118 seconds and 1 MiB. Use Prepare or trim audio above for other supported formats. Keep this tab open during transfer.

Your file stays in this browser until you upload.

Optional mouth routines · limitedOff · optional

Mouth movement plays stored MP3s: playback can interrupt motors and replace your eyes and colors. Protection and estimated clip timing can delay other routines; exact synchronization is unavailable.

〰
Jaw animationUses audio clips already stored on your Skelly
Edit palette

Edits update the current Studio settings. Save your scene to keep them in its library.

Rename scene
Import scenes

    Keep your current edits?

    Generated SkellyAutonomous.ino