Hai Robo Plugins
Build something for a small robot that sits on a desk. A plugin is a web page — HTML, CSS and JavaScript — that runs inside Hai Robo and can talk through it, move its eyes, colour its lights, turn its head, and read where your face is.
No native code, no build step, no SDK to install. If you can write a web page, you can write a plugin.
await hairobo.voice.speak('Good morning');
await hairobo.led.set('#FF8A18');
await hairobo.eyes.look(0, 0.3);
Start here
- Open the simulator in a browser. It runs your plugin with the robot APIs stubbed out, so you can build the whole thing before you ever touch a device.
- Copy
starter/and editindex.html,plugin.jsandmanifest.json. - Upload the folder. We host it — there is nothing for you to deploy.
- Open Hai Robo signed in with the same account. Your draft is in Settings → Plugins → Gallery, marked DRAFT and visible only to you. Tap Try it to run it on your actual robot.
- Re-upload as often as you like — a draft is mutable and costs no version number. When it's right, hit submit for review.
What a plugin is made of
my-plugin/
manifest.json who you are, what you need → docs/manifest.md
index.html your entry point
plugin.js your code
Every file you want installed must be listed in the manifest's files array.
There is no zip and no bundler — the app fetches exactly what you list.
Documentation
| manifest.md | Every field, which are required |
| api.md | The complete hairobo.* surface |
| permissions.md | What you can ask for, and what the user sees |
| limits.md | The sandbox. Read this before you build |
| publishing.md | Getting into the gallery |
Examples
starter/ |
The smallest thing that runs |
hello/ |
Speaking and lights |
breathe/ |
A guided breathing session — timing, LEDs, voice |
follow-me/ |
Camera, events and head movement. The most complete example |
Two things that catch people out
Your plugin has no internet. The CSP blocks every outbound request. No fetch, no CDN, no analytics, no fonts. Everything ships in your folder. This is deliberate — see limits.md.
Permissions you ask for may be declined. Every robot call returns false
rather than throwing when the host declines it, and there may be no dock
connected at all. Write for that: a plugin that only works with a robot
attached is a plugin most people see broken.