Help
Troubleshooting
Fixes for the problems people hit most often.
Still stuck after trying these? Ask in the MIRA Discord.
Building
My assistant gave me Rust code, not an app
The finished app is one HTML file plus a passing validation result. Ask your assistant to finish the build with the guide’s packager and validator.
On claude.com, use a chat that can run code and create files, and press Continue if Claude stops partway. If the session can’t install the compiler, switch to Codex or Claude Code with the same guide.
ChatGPT says it can’t build the app
ChatGPT.com isn’t supported for building MIRA apps. Use Claude on claude.com, Codex or Claude Code with the same guide.
The build fails because the app is over 64 KB
Your module’s memory is a single 64 KiB page. Shrink buffers and static data and rebuild. Don’t raise the limit or remove the maximum. See Limits.
Adding and installing
Check code fails
Send the error to your assistant, ask it to fix the source, and have it run validate.py on the final file. Common causes are missing memory flags, a function the SDK doesn’t provide, a module over 128 KB and a file over 2 MB.
It says the title must match the package title
Leave the title that filled in from the file. To rename an app, rebuild it with the new name in both the Rust code and the manifest. See Naming.
Install says the glasses aren’t connected
Connect your glasses in the MIRA app, then tap Install again.
My glasses are out of room
MIRA lists the apps on your glasses with their sizes. Delete the ones you don’t need and try again.
My update doesn’t show up
Long-press the card, tap Edit App, upload the new file and tap Save. Then tap Update and Open. Keep the same app name between versions.
On the glasses
Some of my text is blank
The glasses fonts don’t include every script or emoji. Stick to supported characters and draw symbols with shapes or bitmaps. See Text.
My image doesn’t appear
Check that len matches the image size, that the frame’s image budget isn’t used up, and that you aren’t drawing with gray 15, which is transparent in 4-bit images. See Images.
Head tracking never starts
Call an orientation function such as imu_yaw_cdeg() on every frame before you check imu_ready(). The call is what turns tracking on.
Looking up doesn’t open the dashboard in my app
Your app is holding head tracking. Call imu_stop() when you no longer need it, or use imu_threshold() if you only need up and down.
Double tap or hold doesn’t reach my app
Claim them with content::double_tap_local(true) or content::holds_local(true). Claims reset every time the wearer switches apps.
My app freezes or quits
A callback probably ran past its instruction budget. Spread heavy work across frames and avoid filling large arrays one byte at a time. See Limits.
Phone and connection
Phone requests keep timing out
Requests expire after 8 seconds and aren’t saved for later. Check the phone link byte from device_status before you tell the wearer the phone is gone: a timeout alone doesn’t mean it disconnected.
Messages from the phone don’t arrive
Call tick on every frame, use the same name in the manifest and in Companion::new, and keep each message under 3,500 bytes.
Microphone audio stops
Capture stops when the glasses disconnect or the page is replaced. Call startCapture() again after a reconnect.