[ norboten ]
Install

One line

macOS or Linux, x86-64 or arm64. Paste it into a terminal.

$ curl -fsSL https://norboten.org/install.sh | sh

It installs uv if you do not have it, installs norboten 0.2.0, and opens it on a setup screen that installs QEMU and starts your first lab. Read the script first — it is under 200 lines and says what it does at the top.

What the script does

  1. Checks the platform. macOS or Linux, on x86-64 or arm64. On Windows it stops and points at WSL2.
  2. Says what it will do and asks once. It never uses sudo.
  3. Installs uv into ~/.local/bin, with Astral's own installer — only if uv is not already there.
  4. Installs norboten from PyPI as a uv tool, in its own environment with its own Python 3.12, so nothing on your system Python changes.
  5. Opens norboten on its setup screen. Doctor checks hardware virtualization, QEMU, SSH, memory and disk. A missing QEMU comes with the exact package-manager command for your system — i runs it after asking; p downloads Lima and the first image; Enter starts the first lab.

Settings go on sh, after the pipe: NORBOTEN_VERSION=0.2.0 pins a version, NORBOTEN_EXTRAS=pdf adds PDF export of journals, NORBOTEN_YES=1 does not ask, and NORBOTEN_NO_LAUNCH=1 does not open norboten.

Pre-1.0, and it changes machine state. Norboten downloads golden images and runs QEMU virtual machines on your computer; a lab then deliberately breaks the machine it created, so run it on a computer whose time you can afford to lose and never on a production host. The API, the database and the lab format still change without migrations, and none of it has had a security review (!). Issues and labs are welcome.

What it needs

ItemWhy
macOS or LinuxLima's Windows driver has neither the disk snapshots nor the serial console the labs rely on; use WSL2 with nested virtualization
hardware virtualizationHVF or KVM; without it a VM boots in minutes instead of seconds
QEMU ≥ 8.2runs the lab VMs
about 4 GB free memoryone lab VM at a time is typical
up to 1.2 GiB disk per imageAlpine 110 MiB, Ubuntu 26.04 663 MiB (932 with the devops tools, 1141 with the automation ones), Rocky 10 814 MiB — plus a lab's own disk while it runs
Docker or Podmanonly for the container labs; everything else runs without one

Lima is not a prerequisite: norboten downloads and pins its own copy, checks its checksum, and keeps it in ~/.norboten. No directory of yours is ever mounted into a lab VM.

What doctor checks

norboten · doctor
 platform        macos on aarch64
 virtualization  hardware acceleration (hvf)
 qemu            QEMU 11.1.1 (/opt/homebrew/bin/qemu-system-aarch64)
 lima            Lima 2.2.0 (pinned, private copy)
 ssh             OpenSSH client
 memory          24.0 GiB RAM
 disk            50.3 GiB free
 containers      docker (for the container labs)

READY

It runs as norboten opens; 8 (System) shows how to fix each item on your platform and d runs it again.

Your first lab

norboten opens one full-screen interface. The sections run along the top — 1 Home, 2 Labs, 3 Theory, 4 Journals, 5 Play, 6 Ratings, 7 You, 8 System — and the arrows walk between them. On the right, doctor's verdict and your lab sessions stay in view; the footer lists the keys that work where the cursor is, and ? lists all of them.

Choose a lab

2 opens the catalogue: every lab with its track, level, time, your status and whether it is rated, and the briefing of the one under the cursor beside it. f narrows it to one track. Start with hello, a five-minute lab on Alpine, and press Enter. From a release without a checkout beside it, a lab you do not have yet comes down with u (pull), by its id.

Start it

s downloads the base image if it is not cached, boots a VM, takes a clean snapshot and then applies the faults. The first lab on a clean machine takes about 27 s, Lima's own download and the 110 MiB Alpine image included; an Ubuntu lab whose image is cached starts in 21.8 s. Both are measured. The status panel shows the VM, the image, the clock and the hints you have used.

Work

The briefing tells you the symptoms and what will be graded, never the cause. o hands the terminal to a shell on the VM — the interface steps aside, and exit brings it back. w shows the checks turning green live as you work; h gives the next hint for a check, each one more specific, with the journal section or manual page it points at (l opens it); t asks the tutor, which never sees the solution. A machine that no longer boots is reached with k, the serial console.

Grade it

c grades the machine, reboots it and grades it again; a check passes only if it passed both times. The Checks tab shows each check before and after the reboot, with a message written for someone who has just failed it. A fix that did not survive the boot shows up as exactly that.

Start again, and read about it

r puts the machine back to its clean snapshot with the faults re-applied, in about ten seconds, as often as you like. After a pass (or S, surrender), m reviews how you got there, v shows the reference solution, j opens the lab's journal — the mechanism, one failure walked through, the wrong turns people take — and y the lab's theory questions. Esc goes back to the catalogue; the VM keeps running until z stops it.

The whole walk-through is in Getting started, every key in the TUI reference.

Update

norboten update

Or u on System (8) when it says a newer release is out. Lab VMs, images and sessions stay.

Uninstall

norboten uninstall

Deletes the lab VMs, ~/.norboten — images, sessions, recordings, sign-in — and the program, after asking. --keep-data keeps the directory; X on System does the same from the TUI.

Troubleshooting

Start with doctor: it runs as norboten opens and again on d, and 8 (System) lists every line with the fix for your platform. A is fine, a ! is a warning that only some labs care about, and a stops labs from running until it is fixed — the verdict under the list says READY or NOT READY. The problems below are the ones that come up, each with what you see, how to confirm it and the fix.

norboten: command not found after the script

Confirm: ls ~/.local/bin/norboten. Fix: the script adds uv's tool directory to your shell's startup file, which only a new terminal reads; open one, or run export PATH="$HOME/.local/bin:$PATH".

✗ qemu QEMU is not installed (or is too old (need ≥ 8.2))

Confirm: qemu-system-aarch64 --version (qemu-system-x86_64 on Intel and AMD). Fix: doctor prints the command for your package manager — brew install qemu, apt-get, dnf, pacman, zypper or apk — and i on the setup screen runs it after asking. On Rocky, RHEL or Alma QEMU is installed as /usr/libexec/qemu-kvm; tell norboten with export QEMU_SYSTEM_X86_64=/usr/libexec/qemu-kvm.

✗ virtualization no hardware acceleration

Confirm: on Linux, ls -l /dev/kvm and id -nG. Fix: /dev/kvm has to exist and your account has to be in the kvm group (sudo usermod -aG kvm $USER, then log in again — i offers it). Inside a cloud VM the provider must enable nested virtualization. Without acceleration a VM boots in minutes instead of seconds, so doctor treats it as a failure.

Lima does not download

Confirm: the lima line on System, and ls ~/.norboten/lima. Fix: Lima is not a prerequisite — norboten downloads its pinned copy (about 35 MB) and checks its checksum. Behind a proxy, set HTTPS_PROXY before starting norboten; p on the setup screen tries again with a progress bar.

✗ paths … is too long for UNIX socket paths

Confirm: echo $HOME — a long home directory, or NORBOTEN_HOME pointed somewhere deep. Fix: a UNIX socket path is capped at 104 bytes and Lima keeps its sockets under norboten's home, so give it a short one: export NORBOTEN_HOME=/tmp/norboten (or any short path), in your shell's startup file.

! containers no Docker or Podman running, or norboten hangs on a container lab

Confirm: docker info — when Docker Desktop is installed but stopped it does not fail, it hangs. norboten gives it ten seconds and then says no runtime is running. Fix: start Docker Desktop (or podman machine start) and press d. Only the container labs need it; every VM lab runs without one.

! memory or ! disk

Confirm: the numbers on the doctor line: RAM under 8 GiB, or under 10 GiB free. Fix: an RHCSA lab needs about 2 GiB of free memory and a Rocky image about 5 GiB of disk; with less, prefer the Linux track (Alpine and Ubuntu). x on System removes a cached image you no longer need.

An image download was interrupted, or fails its digest

What you see: the lab's log says the download failed, or downloaded image has digest …, expected …. Fix: nothing half-downloaded is ever used — the file is checked against the digest in the image registry before it is installed, and a mismatch is deleted. Press s again (or p on the image on System) and it downloads from the start.

A lab behaves as if its image were older than the lab, after an update

Confirm: System lists the cached images with their versions. Fix: a cached image is reused as long as it is there. Select it on System, x removes it and p pulls the current one; D on the lab destroys the VM built from the old one.

A lab VM does not come back after a reboot

What you see: every check fails with The machine is not reachable over the network — it may be stuck during boot, and the serial console's last lines as evidence. Fix: that is often the lab working as intended — or your fix breaking the boot. k attaches to the serial console to see where it stopped, and b presses reset and lands you in the bootloader.

Ratings, Live or sign-in say the API is not reachable

What you see: https://api.norboten.org is not reachable (ConnectError) on Ratings or You, or the API answered HTTP …. Confirm: curl -s https://api.norboten.org/readyz. Fix: labs, theory and journals never need the server, so everything else keeps working offline. For a server of your own, NORBOTEN_API points norboten at it.

Signing in does not work

What you see: the sign-in dialog (a) reports an error from the server. Fix: an account is only needed for rated labs, the boards and streaming; everything else works signed out. If the server says sign-in is not configured, it is a self-hosted server without its sign-in keys (see Self-hosting). A token that has expired simply asks you to sign in again.

Everything is broken and I want to start over

r on the lab puts the machine back to the clean snapshot with the faults re-applied, in about ten seconds. D destroys the VM entirely; the next s builds a new one. norboten uninstall --keep-data removes only the program.