Skip to main content

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)

Source distribution for cbrm 0.2.0
File Size Uploaded
cbrm-0.2.0.tar.gz 46.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for cbrm 0.2.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

0.4.1

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

This release

0.2.0 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page