cbrm — manage BERO HOST servers from the terminal, from code, and from AI assistants
cbrm ("BERO management") operates BERO HOST KVM rootservers without clicking through the customer panel: check status, read the panel's action log, look at the VNC console, power a server on or off, type at its console. It is one package with five faces:
| You are | Use | Start with |
|---|---|---|
| a person at a terminal | the CLI cbrm |
cbrm vms |
| a team or a service | the HTTP API cbrm serve (OpenAPI, bearer token) |
docs/operations.md |
| an AI assistant (Claude, …) | the MCP server cbrm-mcp and the skill in skills/bero/ |
MCP setup |
| a Python program | from cbrm import Panel, Console or cbrm.service.Service |
docs/architecture.md |
| a contributor | Forgejo, see CONTRIBUTING.md | nix develop |
BERO HOST is a German provider of prepaid game, root and virtual servers. Its panel is pleasant to use by hand; cbrm exists for the moments when a script or an assistant should do the same thing. It is an independent community project, not made or endorsed by BERO HOST, and it only does what a customer can do in the panel with their own login.
What it can do
| Area | CLI | API | MCP tool | Changes the server |
|---|---|---|---|---|
| All servers of the account | cbrm vms |
GET /vms |
bero_vms |
no |
| Status: state, hostname, IPv4/IPv6, last backup, last installed template | cbrm status <vm> |
GET /vms/{vm} |
bero_status |
no |
| Action log (installs, restarts, starts) | cbrm logs <vm> |
GET /vms/{vm}/logs |
bero_logs |
no |
| Console screenshot | cbrm console <vm> out.png |
GET /vms/{vm}/console.png |
bero_console |
no |
| Power: start, stop, shutdown, restart | cbrm power <vm> <action> --confirm <vm> |
POST /vms/{vm}/power |
bero_power |
yes |
| Console input: text and keys | cbrm input <vm> --text … --key enter --confirm <vm> |
POST /vms/{vm}/console/input |
bero_console_input |
yes |
| Installable templates, stored SSH keys | cbrm templates <vm>, cbrm ssh-keys <vm> |
GET /vms/{vm}/templates, /ssh-keys |
bero_templates, bero_ssh_keys |
no |
| Root password: show, set or generate | cbrm root-password <vm> --confirm <vm>, cbrm set-root-password <vm> --confirm <vm> |
POST /vms/{vm}/root-password/reveal, /root-password |
bero_root_password, bero_set_root_password |
showing: audited; setting: yes |
| Reinstall from a template, SSH keys baked in | cbrm reinstall <vm> --template "Arch Linux" --ssh-key <name> --confirm <vm> --confirm-destroy <vm> |
POST /vms/{vm}/reinstall |
bero_reinstall |
erases the disk |
Every changing operation repeats its target (--confirm <vm> / confirm) and is written to an audit
log (secrets never are). A reinstall erases the disk and therefore needs the target twice
(--confirm and --confirm-destroy). Not included yet: backups and restore, network reset, ISO and
boot order, renewals, upgrades and credit.
A typical fresh start with your own operating system: cbrm reinstall <vm> --template "Arch Linux" --ssh-key <your key> …, wait until SSH answers with your key, then install what you like over SSH
(for example with nixos-anywhere).
Install
pipx install cbrm # from PyPI (or: pip install cbrm)
uvx cbrm vms # run without installing (uv)
nix run git+https://git.corbet.ch/corbet-infra/cbrm -- vms # Nix (flake)
Python 3.11 or newer. Dependencies: httpx, selectolax, websockets, vncdotool, Pillow, FastAPI, uvicorn, mcp.
Configure
| Variable | Meaning |
|---|---|
CBRM_USER, CBRM_PASSWORD |
the panel login |
CBRM_CREDENTIALS_CMD |
instead: a command that prints the user and the password on two lines (pass, sops, a vault CLI, …) |
CBRM_VMS |
optional allow-list, e.g. "10001 10002": every other server is refused |
CBRM_API_URL, CBRM_API_TOKEN |
use a running cbrm serve instead of logging in yourself |
XDG_STATE_HOME |
where the session cookie and audit.log live ($XDG_STATE_HOME/cbrm, mode 0700) |
export CBRM_CREDENTIALS_CMD="pass show hosting/bero-host"
cbrm vms
cbrm logs 10002 -n 5
cbrm console 10002 screen.png
cbrm power 10002 restart --confirm 10002
MCP
For Claude Code, Claude Desktop or any MCP client (stdio):
{ "mcpServers": { "bero": { "command": "uvx", "args": ["--from", "cbrm", "cbrm-mcp"],
"env": { "CBRM_CREDENTIALS_CMD": "pass show hosting/bero-host", "CBRM_VMS": "10001 10002" } } } }
With a shared API the assistant never sees the panel password:
"env": { "CBRM_API_URL": "https://cbrm.example.internal", "CBRM_API_TOKEN": "…" }.
The skill skills/bero/SKILL.md teaches an agent the safe order of work
(read, confirm, act, look again); copy it into your agent's skill directory.
How it works
BERO HOST does not publish an API, so cbrm uses what the panel itself uses: its login form, its server-rendered pages, one Livewire request for the action log, the JSON endpoints behind its power buttons, and the noVNC console session it hands out (a Proxmox VNC websocket, bridged to a local port and driven with vncdotool). Details in docs/architecture.md.
If the panel changes, cbrm fails with a clear error instead of guessing; see docs/operations.md.
Where the code lives
| Place | Role |
|---|---|
| git.corbet.ch/corbet-infra/cbrm | primary: issues, pull requests, releases |
| GitHub, GitLab, Bitbucket | read-only mirrors, updated automatically from the primary |
Please open issues and pull requests on the primary; changes pushed to a mirror are overwritten.
License
LGPL-3.0-only WITH LGPL-3.0-linking-exception — use cbrm from any application under any license; changes to cbrm itself stay open. Details in LICENSE.md. Contributions are welcome under the same terms; see CONTRIBUTING.md.
Metadata
Release files for cbrm 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cbrm-0.2.0.tar.gz | 46.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cbrm-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 90.7 kB
Release files / cbrm-0.2.0.tar.gz
| Download URL | cbrm-0.2.0.tar.gz |
|---|---|
| Size | 46.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b01d05c89f23360fc3f0e11afa435738c4ef4ef1d06875370e0d2d760e1526b9
|
|
BLAKE2b-256 checksum How to use checksums |
dd909f115114d14ca05c8ad7a38f51e2fc4f474b22d23515426ccc5aa67118c3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.7
|
Release files / cbrm-0.2.0-py3-none-any.whl
| Download URL | cbrm-0.2.0-py3-none-any.whl |
|---|---|
| Size | 44.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
838b6c92081c2f4fa9cbaca9307796db271435319fbb131f5ea190fb17a66638
|
|
BLAKE2b-256 checksum How to use checksums |
a690615f6a6454510f346fdda98bd6f53d9ac776425ec547425a10b7849309bf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.7
|