Firmware and apps share one JavaScript runtime. You need no cross-compilation toolchain, and no embedded background.
The runtime follows the ECMA-419 standard and the UI uses a declarative component model — if you have written front-end code, you can start today.
The firmware is split by responsibility: UI, input, light, camera, motion, audio, connectivity, conversation. Each part can be replaced or trimmed independently.
Interfaces are described declaratively and share one rendering layer with expressions — swapping a face needs no renderer changes.
Simulator and hardware run the same firmware. WebAssembly reproduces device behaviour in the browser, so you don't flash a board to develop.
From nothing to your first custom expression is usually under ten minutes.
Open the installer in Chrome or Edge, connect DeskBot over USB and click install. Nothing is installed on your computer.
Open the simulator in your browser — it boots the robot from the same firmware compiled to WebAssembly. Get the behaviour right here first, then push to hardware.
Create a directory, add a manifest and an entry script, and call the device capability APIs. It can be a new face, or full control of the servos.
// A minimal MOD: show a surprised face when picked up
import { Motion, Display, Face } from "aieer/device";
const surprised = Face.from({
eyes: [{ x: 6, y: 4, w: 4, h: 4 }, { x: 14, y: 4, w: 4, h: 4 }],
mouth: [{ x: 11, y: 12, w: 2, h: 2 }]
});
Motion.on("lifted", async () => {
await Display.show(surprised, { duration: 1200 });
await Motion.tilt(0);
});This is an overview of the most-used interfaces; the reference shipped with the firmware is authoritative.
| Display.show(face, opts) | Switch expression, with duration and transition animation |
| Display.text(str, opts) | Overlay text or status on top of the expression layer |
| Motion.pan(deg) / Motion.tilt(deg) | Set pan and tilt angle with easing and rate limiting |
| Motion.on(event, cb) | Subscribe to motion events (lifted, placed, tilted, pushed) |
| Audio.listen(opts) | Start recording or hook up wake-word detection |
| Audio.speak(text, opts) | Streaming speech synthesis with interruption support |
| Vision.track(kind, cb) | Subscribe to face or hand tracking results |
| Light.set(rgb, opts) | Set indicator colour, brightness and breathing rhythm |
| Storage.get/set(key, val) | On-device persistence for settings and session preferences |
| Net.request(opts) | Make network requests to your own services |
We want you to be able to change the hardware as well as the software.
Enclosure models are published — modify, print, or use them to design accessories and stands.
Structural assembly drawings and schematics are public, for repair, teardown and secondary development.
Feature requests, bug reports and improvements are welcome; community MODs can also apply for a featured slot in the gallery.
Custom firmware, capability access and support can be arranged directly through our business channel.