Modified comment
Using here document for keyboard maps

Preventing possible interpolation using 'KEYMAP' (instead of KEYMAP).
Prefixed keyboard maps with "normal" and "shift"

To simplify the codes, the modifier key ("normal" as no key and "shift" as shift modifier key) prefixes the keyboard row string.
Refactored code: consolidated keyboard/scancode mapping
Defining sendrc() bash function

Reduces keystrokes for almost every command, since the curl... is replaced by just "sendrc <stepnr>" now.

Added definition of function as second step. Testing the proper functionality of the sendrc() shortcut using the true command.
Checking web server thread in step loop

When restarting the script too early, the following message sometimes appeared (sorry, german):

Thread 1 terminated abnormally: HTTP::Daemon: Die Adresse wird bereits verwendet        ...propagated at ./install-archlinux-inside-vm line 270.

(Something like address already used)

The embedded web server is essential for getting the return code of the executed commands. For this, the thread is checked before executing the step.

Check in action:

Thread 1 terminated abnormally: HTTP::Daemon: Die Adresse wird bereits verwendet        ...propagated at ./install-archlinux-inside-vm line 270.
Web server thread inactive at ./install-archlinux-inside-vm line 518.