An App in the Launcher that runs the same commands as USB serial and the Debug Console, trusted like the first. It shows what the console prints while it is open, through a second ring of the console's that exists only meanwhile; Ctrl+b keeps only what follows your own commands. Tab completes a command's name from the firmware's help text, Fn with up and down recalls earlier lines, Alt with up and down scrolls back. `rm` asks first in the Shell, `rm -f` doesn't. Nothing is kept once the App is left. `screenshot [seconds]` saves the screen as a PNG in /screenshots on the card, now or after a pause: written a row at a time, indexed colour with RGB332 as the palette, in one stored deflate block. 487 host tests (11 new: the PNG writer, the Shell's log filter, Tab). Checked on the device over the Debug Console: commands, Tab, history, a screenshot fetched and decoded on the PC, rm with and without the question, a delayed screenshot of another screen. 12 KB of flash; 7 KB of heap while open. Decisions Q204 to Q212 in docs/milestones/S1.md. Safe Mode: #77. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
3.1 KiB
+++ title = "Shell" description = "The firmware's own commands, typed on the device: look at its state, the SD card, the radio and the network with no PC and no cable." weight = 9 [extra] tag = "Shell" +++
The firmware has a set of commands, made for working on it from a PC. The Shell runs them on the device itself: no computer, no cable, no Wi-Fi. It is the tool for the day something is wrong and you are nowhere near a desk.
It can do real damage: rm deletes, reboot restarts, debug on opens the device to the network. It is the same trust as holding the device, and nothing more.
Using it
Type a command and press Enter. help lists them all; the command reference says what each does. A few to start with:
| Command | Shows |
|---|---|
info |
The firmware's version, uptime, memory, Wi-Fi, the SD card and both firmware slots |
wifi status |
The network, the address, and where the DNS and time servers came from |
ls /notes |
A folder of the SD card, with sizes and dates |
crash |
The last crash, if there was one |
update check |
Whether a newer release exists |
lora status |
What the radio is set to and what it has heard |
- Tab completes the command's name. If several fit, it lists them.
- Fn with up and down brings back lines you typed before.
- Alt with up and down scrolls back through what was printed.
clearempties the screen, andquit(or Back) leaves.
What you see
The Shell shows everything the firmware prints while it is open: the answers to your commands, and whatever the rest of the system says meanwhile (IRC connecting, a packet received). On a ten-line screen that can be a lot.
Ctrl + b hides the background: then only what is printed in the ten seconds after each of your commands is kept, and mine shows in the corner. It is ten seconds and not "the answer" because some commands answer a moment later, from another part of the firmware, and nothing marks their lines as theirs.
Deleting asks first
rm <path> asks before it deletes, here where a slip of the finger is one key away. rm -f <path> does not ask.
Screenshots
screenshot the screen, now
screenshot 5 the screen in 5 seconds: time to go to another App
The picture is saved as a PNG in /screenshots on the SD card, named by date and time, and a Toast says so once it is written (so the Toast is never in the picture). From the Shell, "now" is always a picture of the Shell: use the pause to get to the screen you want. The Storage App shows the files; to look at them, take the card to a computer.
What it costs
Nothing while it is closed. Open, about 7 KB of memory, given back when you leave: with IRC connected and a Gemini page open, that can be the difference (see the memory limit).
The keys, as the device lists them
What Fn + h shows on this screen. This table is generated from the firmware's own lists, so it is always the current one.
{{ keys(scopes=["shell"]) }}