Skip to content

Command-line administration

Create a realm's first administrator with backd bootstrap, then manage users and API keys from the command line through the admin API.

The backd binary is also the command-line client for administering a realm. backd user and backd apikey don’t touch MongoDB: they call the realm’s admin API on a running backd, as an administrator. They never need database credentials, and every change they make goes through the same checks as any other admin request, including network restrictions.

Two commands write to MongoDB directly instead: backd bootstrap, which creates a realm’s first administrator, and backd secret rotate-key, which re-encrypts every realm’s secrets under a new master key (see Secrets).

Conventions

  • Every value is a flag. There are no positional arguments: backd user create --realm blog --email ada@example.com. --realm (and --email, --name, …) are required where the command needs them, and --url picks the server (below). backd <command> --help, or backd <command> help, lists a command’s flags; backd help lists the commands.
  • Exit codes. 0 on success (and after help); 1 when the command ran and failed (a server error, a wrong password, a missing CONFIG_DIR); 2 when it was invoked wrongly (an unknown command or flag, a missing or invalid flag value). Scripts can tell the two failures apart.
  • Output. Help and results go to standard output; warnings, errors and prompts go to standard error, so KEY=$(backd apikey create --realm blog --name ci) captures only the key.

Local and remote commands

CommandWorks onNeeds
backd serve, backd provisionMongoDB and CONFIG_DIRCONFIG_DIR, MONGO_URI
backd template, backd databases, backd rules testCONFIG_DIRCONFIG_DIR
backd typesCONFIG_DIR, or --from <url>CONFIG_DIR, or the running instance
backd functions build|typesCONFIG_DIRCONFIG_DIR (build also needs Deno)
backd bootstrap --realm <realm> --email <email>MongoDB, once per realmCONFIG_DIR, MONGO_URI, a provisioned realm
backd login, backd logout, backd whoami, backd account …A running backdIts URL
backd user …, backd apikey …, backd data transfer|assign-org, backd orgs list|show|create|owned|delete|reactivate|members|add-member|invite|invitations|revoke-invitation|assign-owner|claims-set, backd push devices|remove-device|sends|test, backd audit …, backd secret set|list|delete, backd functions invoke|history|logs|jobs, backd triggers status|gaps|resolve, backd storage check|usage|reconcile, backd compliance scope, backd consents notify|record, backd app-config get|set|reset|history|rollbackA running backd, through the admin API or the function’s own routeIts URL, and a stored session or BACKD_API_KEY
backd triggers rescanMongoDB, directly, like backd provision: it may read a whole collectionCONFIG_DIR, MONGO_URI
backd secret rotate-keyMongoDB, directly (not the admin API)CONFIG_DIR, MONGO_URI, BACKD_SECRETS_KEY, BACKD_SECRETS_NEW_KEY
backd versionNothingNothing

The first administrator

Administrators are users holding an admin role: a role with admin: true in realm.yaml. The template (backd template realm) declares one, named admin:

roles:
  admin:
    description: Manages users, invitations and API keys
    admin: true

Once the realm is provisioned, create its first administrator where backd runs, with the same CONFIG_DIR and MONGO_URI:

docker compose exec backd /backd bootstrap --realm blog --email ops@example.com
# Password:
# Repeat password:
# created ops@example.com (id d3c9ljp8hc2g00b6s1m0) with the admin role "admin" in realm blog
  • If realm.yaml declares several roles with admin: true, choose one with --role. A role that opens only some areas can’t be the first administrator’s: it can’t manage the rest.
  • After the first administrator, others are created by an administrator, through the API.
  • The password follows the realm’s password policy. It is read from the terminal without echo, or as the first line of standard input.
  • To keep the assignment if the realm is ever rebuilt from its config, also list the email under the role’s users in realm.yaml. bootstrap reminds you when it isn’t listed.

At startup, backd warns about each realm that declares no admin role, or whose admin roles nobody holds.

Your own sign-in security

backd account manages the signed-in user’s own second factor with the session backd login stored (an API key is not a person). Each change asks for a fresh proof: the authenticator code if the user has one, else the password.

CommandWhat it does
backd account mfa-statusWhether two-step verification is on, and the recovery codes left
backd account mfa-enableSets an authenticator app up (QR code, first code) and shows the recovery codes once
backd account mfa-disable --yesTurns it off (refused for a role that requires it)
backd account recovery-codesReplaces the recovery codes, shown once

backd apikey create asks for the same proof when it runs with a session: an administrator’s key outlives the session and bypasses MFA, so a person confirms it. With BACKD_API_KEY set there is nobody to ask.

Logging in

backd login --realm blog --url https://api.example.com
# Email: ops@example.com
# Password:
# logged in to realm blog on https://api.example.com as ops@example.com (session expires at … at the latest)

backd whoami --realm blog
# ops@example.com (id d3c9ljp8hc2g00b6s1m0) on realm blog at https://api.example.com; roles: admin

backd login signs in through /_auth/login, like any user, and keeps the session for the following commands. It is an ordinary session: the realm’s idle timeout, maximum lifetime, login throttling and the user’s login_networks all apply, and it shows up in the user’s session list. backd logout --realm blog ends it on the server and forgets it.

  • The second step. A user with a second factor is asked for its code after the password (Code from your authenticator app (or a recovery code)); a user in a required role who has none sets one up in the terminal: the command shows a QR code made of block characters, the otpauth:// address and the secret to type in, asks for the first code, and shows the recovery codes once (on a terminal it waits until you have saved them). The code is read from the terminal or from the next line of standard input, after the password.
  • --magic-link. backd login --realm blog --email ops@example.com --magic-link asks for a message instead of a password (the realm needs magic_link) and then for the 6-digit code in it.
  • Server: --url, else the BACKD_URL environment variable, else the server of the last login.
  • Email: --email, or a prompt. When standard input isn’t a terminal, --email is required and the password is the first line of standard input.
  • Sessions are stored per server and realm in ~/.config/backd/credentials (or $XDG_CONFIG_HOME/backd/credentials, or the file named by BACKD_CREDENTIALS). The file is created readable only by you, in a directory only you can open. Anyone who can read it can act as you until the sessions expire, so log out on shared machines.
  • TLS: backd verifies the server’s certificate against the system’s CAs. For a private CA, such as the local stack’s, point BACKD_CA_CERT at its PEM file. Logging in over plain HTTP to anything but localhost, a loopback address, or a host name without dots (a container on a private network, such as http://backd:8080) prints a warning: the password would travel unencrypted.

Using an API key instead

When BACKD_API_KEY is set, backd user and backd apikey send that key instead of a stored session. It must be an API key with the admin role. This suits automation that can’t log in interactively:

BACKD_URL=https://api.example.com BACKD_API_KEY=$ADMIN_KEY backd user list --realm blog

Errors

Commands print the API’s error code and message, with a hint when there’s something to do:

AnswerUsual cause
401 with a stored sessionThe session expired, was revoked (a password change revokes the others), or isn’t accepted from this network: log in again
403 forbiddenThe user has no admin role, or the key has the data role
404 not_found on admin commandsThe realm doesn’t exist or has auth disabled, or the admin API isn’t reachable from this network (admin.allowed_networks, or a proxy rule such as the production reference’s ADMIN_ALLOW_FROM)

Every command

backd help lists the same commands in the same groups; backd <command> --help shows one command’s flags.

Develop — for building with backd (see also the quickstart):

CommandPurpose
backd template project|realm|database|function|email-captureCreate config files under CONFIG_DIR: a whole project, or a realm, database, function or dev email function inside it (see Starting from a template)
backd config check, backd config fingerprintValidate CONFIG_DIR as startup would, or print its fingerprint (see Deploying config)
backd rules testRun each collection’s rules.test.yaml against its rules:, without a database (see Testing rules)
backd databases [--collections]Print the MongoDB databases (or collections) the config uses, one per line (needs only CONFIG_DIR; see least-privilege deployments)
backd typesGenerate a realm’s TypeScript types (see Typing and OpenAPI)
backd openapiGenerate a realm’s OpenAPI 3.1 document (see OpenAPI)
backd functions build|invoke|history|logs|jobsBundle the functions with Deno, call one through a running backd, and see its recent calls, console output and jobs (see Calling functions, Async jobs)

Session:

CommandPurpose
backd login --realm <realm>Sign in to a running backd as an administrator and keep the session (see Logging in)
backd logout, backd whoamiEnd the stored session, or show who it belongs to
backd account <command>Manage your own second factor and recovery codes (see Your own sign-in security)

Administer a realm:

CommandPurpose
backd bootstrap --realm <realm> --email <email>Create a realm’s first administrator (see The first administrator)
backd user <command>Manage a realm’s users through the admin API (see Users and passwords)
backd orgs <command>Manage a realm’s organizations, members, teams and claims (see Organizations)
backd apikey <command>Manage a realm’s API keys (see API keys)
backd push devices|sends|testSee a realm’s push devices and send records, and send an audited test push (see Records and test send)
backd secret set|list|delete, backd secret rotate-keyManage function secrets; rotate-key re-encrypts them under a new master key, on MongoDB directly
backd auditPrint the realm’s audit trail, newest first
backd data check|transfer|assign-orgCheck stored documents against their schemas, move documents between collections, or assign them an organization
backd storage check|usage|reconcileCheck a realm’s object storage, report its usage, or clean up orphans (see Keeping storage tidy)
backd files regenerateRebuild image versions the documents already hold
backd compliance scopeWhat a user’s personal data export covers
backd consents notify|recordManage the consents users accept
backd app-config get|set|reset|history|rollbackThe realm’s app configuration: values, history, rollback
backd triggers status|gaps|resolve, backd triggers rescanSee and repair what the trigger dispatcher did; rescan writes to MongoDB directly

Server:

CommandPurpose
backd serve [--with-worker]Load config, provision or verify MongoDB, serve HTTP; --with-worker also runs the worker role (see Deploying config)
backd provisionLoad config, apply provisioning once and exit
backd workerClaim and run async jobs; WORKER_CONCURRENCY caps how many run at once
backd executorRun server-side functions for backd (needs Deno; see Running in production)
backd egressRun the egress role, the executor’s only way out (see Outbound network)

General: backd help, backd version.

Edit this page · Last updated 19 Oct 2026