Limitations¶
Security¶
Nothing on this machine is access-controlled. The network features were built for a hobby machine on a home network, and they assume everyone who can reach the device is welcome to use it.
| Remote desktop | No authentication. Anyone on the same network can open the address, watch the screen and send keyboard and mouse input — that is, operate the machine |
| The file and app endpoints beside it | Also unauthenticated, and in the released build. Anyone who can reach the remote desktop can also list, read, write and delete files, and start or stop apps |
| BLE console and debug service | No pairing, no bonding, no encryption (deliberately, because pairing breaks Web Bluetooth on Windows). Anyone in radio range can read and write files, read the log, and start or stop apps |
| Remote debugger over TCP | No authentication. It listens on all interfaces |
| Wi-Fi credentials | Stored in plain text in /etc/wifi.toml on the device |
| Service keys | An API key given to the speech service sits in plain text in services.toml, and the development build serves /home over HTTP |
| Apps | An app you download runs with the same rights as any other. There is no sandbox between apps and the filesystem |
Use these features only on a network you trust, and at your own risk. Do not forward a port
to the device from the internet. Wi-Fi can be kept off at boot with wifi_auto_start in
Config, and on Retro BLE likewise with ble_auto_start; on Modern BLE always starts at
boot and cannot be stopped while the machine is on.
Differences from R2P2¶
Family mruby is based only on the core part of PicoRuby, and some gems used in PicoRuby's official R2P2 have been independently rewritten. As a result, there may be differences in the available classes and method behavior.
Differences Between PicoRuby and CRuby¶
PicoRuby is based on mruby, so some methods that are standard in CRuby may not be available.
Heap Size¶
Each Family mruby app runs as an independent Ruby VM, with its own heap and stack allocated on PSRAM.
| Item | Retro | Modern | Studio |
|---|---|---|---|
| Standard app heap | 500 KB | 1024 KB | 1536 KB |
Heap with large_memory = 1 |
1024 KB | 2048 KB | 3072 KB |
| User app slots | 5, and how many fill depends on the memory the machine has. max_apps in system_conf.toml lowers it |
You can check heap usage in the Monitor app.
Language support status¶
| Language | Status |
|---|---|
| Ruby (PicoRuby) | The main language. Everything documented here |
| MicroPython | Usable, with real limits: one Python app at a time, no writing files, strings that are bytes, and a smaller standard library. Drawing, sprites and sound are there. See MicroPython and BASIC |
| BASIC | Feature-complete as of 2.0. Every known difference from Family BASIC V3 is catalogued. See MicroPython and BASIC |
| Lua | A concept implementation. Not suitable for building a substantial application |
Waiting inside an app¶
Prefer Machine.delay_ms, which is FreeRTOS vTaskDelay underneath:
Machine.delay_ms(500)
Better still, do not block at all: return the number of milliseconds until you want to be
called again from on_update, and let the message pump do the waiting. An app that blocks
processes no events while it does.
This was worse before 2.0
In 1.0 the tick that drives PicoRuby's task switching had to be disabled: calling it
from outside the VM corrupted the VM stack. That is fixed — ticks are now accumulated
by a signal source and applied at one point in the scheduler — and the Task feature
works. The Machine.delay_ms recommendation above is about not blocking, not about the
old corruption.
File System Limitations¶
| Item | Details |
|---|---|
| Maximum file size | Within LittleFS limits (a few MB recommended) |
| Maximum path length | FmrbConst::MAX_PATH_LEN |
| File names | ASCII recommended. Avoid Japanese characters and special symbols |
Dir#seek / Dir#tell |
Not supported (ENOSYS). Use rewind and count from the beginning |
Inter-App Message Size Limit¶
The payload for Pub/Sub publish / send_message is limited to 176 bytes after MessagePack encoding. If you exceed this limit, consider transferring data via files or splitting it across multiple messages.
Machine-specific limitations¶
Most limits apply to both machines. These do not.
Modern (M5Stack Tab5)¶
| microSD | The slot is not wired up in the firmware yet. Internal flash only |
| Video out | The built-in panel is the only output. No composite video |
| GROVE | One port, not two |
| Battery-backed clock | Present (RX8130). The timesync service sets it from the network once the machine is online; Set Clock is the manual way |
| Mouse wheel | A USB mouse's wheel works only for a device named in /etc/hid_devices.toml. Plug the mouse in and the log prints the line to add |
Retro (narya-board)¶
| Wi-Fi and BLE | One radio, one at a time. Running the BLE console means Wi-Fi will not start, and vice versa |
| Touch | No touch panel. A USB mouse is the pointer |
| Remote desktop | Not available |
| Firmware | Two chips to flash, and both must be on the same version or the system will not boot |
| Resident services | Not carried in the Retro firmware. The clock, network and speech services are Modern only |
| WAV playback | play_wav returns false. The audio is at the far end of a serial link, and shipping a clip across it before a note could sound is too slow to be worth it |
| Mouse wheel | The same per-device rule as Modern |
Studio (the browser build)¶
| Network | FmrbNet.request fetches through the browser, so a server that refuses cross-origin requests cannot be read. Sockets — Net::HTTP, WebSocket — are not there |
| Files | /home and /app/usr are kept in the browser and nowhere else, and so are the settings. Everything outside them is built fresh on every reload. Download the archive to keep anything |
| Browsers | Desktop Chrome and Firefox. Safari is untested; phones and tablets are not a target, because the machine wants a keyboard |
| One tab | Open the page twice and only the first tab saves |
See Family mruby Studio.