QBxBot Command Channel
The Command Channel lets you operate your QuickBox Pro install from your own messaging account. You send a short command to QBxBot — your install’s own private bot — and it carries out the action and replies to you over the same chat. You can link a Discord account or a Signal account; the channel is transport-neutral, so linking and commanding work the same way on either.
QBxBot is not a shared community bot. Each install runs its own bot, dials out to your chosen messaging platform, and only ever acts on your install. Nothing is exposed to the public internet, and the bot can only run a small, fixed set of commands that an administrator has chosen to allow.
The Command Channel does nothing until an administrator enables it for the whole install and you opt your own account in. Both are required, and both are off by default.
What you can do
Command from chat
DM your install's QBxBot to check or control your apps without opening the dashboard
Control and check
Start, stop, and restart your services, and check status, disk, VPN, and downloads from chat
Custom aliases
Name your own shortcuts for the commands you are allowed to run
Verified and audited
Only your linked account can command on your behalf, and every action is recorded
Use the Command Channel when
- You want to restart a stuck app from your phone without logging in
- You are away from the dashboard and just need a quick status check
- An admin needs to bounce a user's service quickly from chat
Use the dashboard instead when
- You are installing or removing apps, or editing configuration — those stay dashboard-only
- You need fine-grained control, a full view, or anything outside the fixed command list
- You are doing something irreversible like deleting a user — those are dashboard-only by design
How it works
A command travels through a fixed path, and your authority is checked at every step before anything runs:
- You DM QBxBot from your linked account.
- QBxBot confirms the message came from your verified account.
- It checks that your account is allowed the command, on the app you named, for the target user (yourself, or anyone if you are an admin).
- For any action that changes state — stopping or restarting a service, or any administrator action like banning a user or triggering a backup — it asks you to confirm before it proceeds. The two highest-impact administrator actions (banning a user and creating a user) ask for a stronger confirmation where you also have to type the target’s name back.
- It runs the action through the same safe, internal path the dashboard uses — and replies to you with the result.
The bot can only run commands from a closed, server-defined list. There is no way to send it a free-form command or a shell command — anything that is not a recognized command is simply ignored.
Works on a home server (no port to open)
The Command Channel is outbound-only. Your install dials out to Discord or Signal to receive your commands — it never waits for an incoming connection. This is the opposite of exposing a dashboard or web app to the internet.
There is no inbound port, no port-forwarding, and no public domain required. Your install reaches out to the messaging platform; commands and replies travel back over that same connection. A home seedbox behind your router — on a residential IP, with no ports opened — works exactly like a hosted server.
This applies to both Discord and Signal:
- Discord — your install opens a connection out to Discord and receives your DMs over it. Nothing listens for inbound traffic on your server.
- Signal — signal-cli on your install keeps its own outbound connection to Signal’s servers. The dashboard talks to it entirely on the local machine, never over the network.
Because nothing is exposed, there is no inbound surface to attack and no firewall rule to add. The only network traffic is your install reaching out to the messaging platform it already trusts.
Setting Signal up the first time — installing signal-cli, fetching the Java runtime, and linking or registering the account — does need outbound internet access, just like installing any app. That is normal outbound traffic; it still opens no inbound port.
Setting it up (administrators)
The admin controls for the Command Channel live on the command tab of Settings > Notifications. You turn on the install-wide master switch there, choose your command catalog, and enable each messaging platform you want to allow.
| Step | What to do |
|---|---|
1. Enable the channel | Turn on the install-wide Command Channel master switch. Nothing accepts commands until this is on. |
2. Choose the command catalog | The catalog lists every command QBxBot supports. Switch on each one you want available; everything starts off. Only the commands you turn on can be run by anyone. |
3. Enable a platform | Set up Discord, Signal, or both (see below). Each platform is enabled independently. |
4. Review insights and the audit log | Watch the command insights summary and the audit log on the same tab to see what is being run and every attempt's outcome. |
The catalog shows the full set of commands QBxBot supports, each with a switch. You choose exactly which ones are available — everything is off until you turn it on, and there is no hidden default set. Each command also shows whether it only reads state or changes it, whether it is for any user or administrators only, and whether it asks for confirmation, so you can see what you are allowing at a glance. A number of sensitive operations can never be exposed through the Command Channel at all, regardless of configuration.
The admin tab has a dry-run switch. With dry-run on, QBxBot parses and authorizes commands but stops short of actually running them — useful for checking your catalog and roles work as intended before going live.
The admin tab also gives you an install-wide kill switch. Turning the channel off immediately stops QBxBot from acting on any command, for every user, on every platform, without removing anyone’s links or settings.
Command insights and audit (administrators)
The admin Command Channel tab includes a Command Insights summary and a Command activity audit log. Insights give you an at-a-glance view over a recent window — how many commands ran, how many were denied, the success rate, and which commands, users, and apps are most active. The audit log lists every individual command attempt and its outcome. Both are administrator-only; there is no equivalent user-facing alert feed.
Enabling Discord
Your install runs one Discord bot, and that single bot does everything: it receives the commands your users DM it and sends those users their alerts as DMs. The same bot token powers both directions. You set it up once.
The bot token you paste in is what makes the channel two-way. With it, your install’s bot can receive a command a user DMs it and send that user a reply or an alert back. A Discord webhook, by contrast, only posts into a channel — it can never receive a command. So commands always need the bot; webhooks are an optional extra for outbound-only delivery. See Bot vs webhook below.
Step by step (administrators)
You create a Discord application with a bot, copy its token, get the bot somewhere it can reach your users, and paste the token into your install. This is a one-time setup.
| Step | What to do |
|---|---|
1. Create the application | In the Discord Developer Portal (discord.com/developers/applications), click New Application, name it (this becomes your QBxBot), and create it. |
2. Add the bot | Open the Bot tab. The bot user is created with the application; this is the identity your users will DM. |
3. Turn on Message Content | Still on the Bot tab, enable the Message Content Intent under *Privileged Gateway Intents*. Without it the bot connects but reads blank text, so no command works. It is self-serve for bots in fewer than 100 servers, which covers a private install bot. |
4. Copy the bot token | On the Bot tab, click Reset Token (or Copy if shown) and copy the token. Treat it like a password — anyone with it can act as your bot. |
5. Get the bot to your users | DMs only work when the bot and the user share at least one Discord server. Invite the bot to a server your users are in (Discord shows you an invite under OAuth2), then share that server's invite link with your users. |
6. Paste the token into your install | Go to Settings > Notification Settings > Channels > Discord, paste the bot token, save, and use Test Token to confirm your install can reach it. Optionally paste your server's invite link so users see a join button. |
7. Enable bot DM delivery and inbound commands | Turn on bot DM delivery in the Discord channel settings, then turn on Discord inbound commands on the command tab. The bot now sends alerts and accepts commands. |
This is the single most common reason a freshly set-up bot reads nothing. If commands you DM the bot are silently ignored, re-check that Message Content Intent is on in the Developer Portal under your application’s Bot settings.
Discord only lets a bot DM a user when they share at least one server. That is why you invite the bot to a server and give your users its invite link — once you and the bot are both in some server, DMs flow in both directions. No public channel is needed and the DMs stay private to each user.
Bot vs webhook — what each can do
This is the single biggest point of confusion, so it is worth being explicit. A bot token and a webhook are two different things:
| Column 1 | Bot token | Webhook |
|---|---|---|
Sends alerts | Yes — as a private DM to each user | Yes — posts into one Discord channel |
Receives commands | Yes — users DM the bot to run commands | No — a webhook can never receive anything |
Who sees it | Only the individual user | Everyone in that channel |
Needed for the Command Channel | Required | Not used for commands |
The bot token is bidirectional — it sends DMs and receives commands. A webhook is outbound-only — it posts to a channel and cannot receive. The Command Channel always runs on the bot; a webhook is just an optional way for a user to also get their alerts in a channel.
Enabling Signal
Signal needs three things in place: signal-cli installed on your server, a Java runtime (signal-cli is a Java application — the installer sets this up for you), and a Signal identity for QBxBot to send and receive on. The Signal settings page has an Install button that prepares signal-cli and Java for you; once that is done, you give QBxBot a Signal identity in one of two ways.
Link Device attaches QBxBot to an existing Signal account as a second device — your phone stays signed in. Register Number claims a phone number for QBxBot outright. Most people should choose Link Device — it needs no spare phone number and is the lower-risk path.
Link Device (recommended)
In the Signal settings, choose Link Device. QBxBot shows a QR code. On your phone, open Signal → Settings → Linked Devices → Link New Device and scan it. QBxBot then rides on your existing Signal account as a linked device — exactly like Signal Desktop. Your phone stays registered and fully working; nothing is taken over.
This is the best choice for a home or personal install because it needs no second phone number — it reuses the Signal account you already have.
Register Number
In the Signal settings, choose Register Number to claim a phone number for QBxBot directly. You enter the number in full international form, solve a Signal captcha in your browser when prompted, and enter the verification code Signal sends by SMS (or voice call) to that number.
Registering a number makes it QBxBot’s primary Signal device. If you register a number that is already in use by a personal Signal account, that account is signed out of Signal on its phone. Only register a number that is dedicated to this install — a spare SIM, a VoIP number, or a Google Voice number that no personal Signal account uses. If you do not have a spare number, use Link Device instead.
After either path, turn on Signal inbound commands to arm it. QBxBot starts listening for DMs on its Signal identity, and your users can link.
You link or register the identity with Signal commands turned off, then arm it. If you ever need to change the identity, disarm Signal first. Arming Signal never affects your Discord setup — each platform is independent.
The number or account QBxBot uses is the address your users DM to. It is your install’s QBxBot identity. Users never type a phone number to link — they prove their own account by DMing a code (see below).
Linking your account
Once an administrator has enabled the channel, each user links their own messaging account from the Command Channel section of their Profile. The link proves control of the account by having you send a one-time code from that account — you never type your account ID or phone number into a form. The steps are the same whether you link Discord or Signal.
You don’t have to set up anything in Discord yourself. Just link your Discord account (below), then DM the bot to run your commands. By default the bot also DMs your alerts to you — no webhook required. If you’d rather have alerts land in a Discord channel as well, you can add one or more named webhooks in your Profile notification settings, but it’s entirely optional.
- Opt in. Turn on the Command Channel for your own account.
- Choose a channel. Pick the platform you want to command from — Discord or Signal (whichever your administrator has enabled).
- Provide a Local API Key. Choose the scope you need (read for status only, write for start/stop/restart) and paste in a matching Local API Key. The key is used once to prove install authority and is never stored or shown again.
- Get your code. The dashboard shows an 8-digit code.
- DM the code to QBxBot. From the account you want to command with, send the bot
verifyfollowed by your code (for example,verify 12345678). On Signal, you DM that code to your install’s QBxBot Signal number. - Done automatically. The dashboard is watching for that message — when QBxBot receives it from your account, the link flips to verified on its own. There is nothing else to click.
Control is proven by the message arriving from your account, not by you claiming an account ID or number. This is what makes the link trustworthy — only the real owner of that account can complete it. It works identically on Discord and Signal.
About the Local API Key
The link is bound to a Local API Key, and the key’s scope decides what your link may do:
- A read key allows status checks only.
- A write key allows start, stop, and restart (and includes read).
If you rotate or clear the bound key in API Settings, the link is disconnected automatically and you will need to link again with the new key. The dashboard shows a “needs relink” indicator when this happens. Installs that use a database-stored key (rather than an environment key) get the cleanest disconnect behavior.
Commands
QBxBot understands a fixed catalog of commands, split into two broad kinds: reads, which only report state and never change anything, and administrator actions, which change something on the install and always ask you to confirm first. Which of these you can actually run depends on what your administrator has turned on (the catalog) and on your role — see Available commands below.
Service control
These act on a specific app’s service. You always name the app, for example status sonarr or restart radarr. A regular user can only act on their own apps; an administrator can target any user’s app by adding the username (for example, restart sonarr alice).
| Command | What it does | Confirmation | Key scope |
|---|---|---|---|
status | Reports whether an app's service is running | No | Read |
start | Starts an app's service | No | Write |
stop | Stops an app's service | Yes — reply to confirm | Write |
restart | Restarts an app's service | Yes — reply to confirm | Write |
When you send stop or restart, QBxBot replies asking you to confirm. Reply to confirm and the action runs; ignore it and nothing happens.
Status checks
These are read-only — they report your own state and never change anything, so they need only a read-scoped key and never ask for confirmation. They take no app name; QBxBot answers for everything you have.
| Command | What it reports |
|---|---|
status all | The running state of every app you have installed |
disk | Your own disk and storage usage against your allowance |
vpn | Your own VPN status and which of your apps are routed through it |
downloads | Active download counts across your own download clients |
The disk, vpn, and downloads checks only ever report your own account — there is no way to see another user’s downloads or VPN status, even for an administrator.
Administrator reports
These read install-wide or per-user information and are available only to administrators. Like the status checks they are read-only and never ask for confirmation.
| Command | What it reports |
|---|---|
telemetry | Live CPU, memory, and disk for the server |
apps | Which system-wide apps are installed |
db | Database health, version, and size |
user <username> | An account summary for one user — status, level, apps, sessions, 2FA |
fail2ban | Fail2Ban status and current ban counts |
quota | Install-wide storage allowance and how much is used |
updates | How many apps, plus QuickBox and the dashboard, have updates available |
Your administrator chooses which commands are available and may set up shortcuts, so the exact word you type can differ. The dashboard always shows you the precise list you can use — see below.
Administrator actions
These change something on the install and are available only to administrators. Every one of them asks you to confirm before it runs, is recorded in the audit log, and reaches the same hardened, internal path the dashboard uses — never a shell, never the public internet. They each need a write-scoped Local API Key. Each action also requires the matching administrator permission, exactly like the equivalent dashboard control.
| Action | What it does | Confirmation |
|---|---|---|
user.ban | Bans a user (cannot ban yourself or a super-admin) | Strong — confirm and type the username back |
user.unban | Lifts a ban and restores the user's access | Confirm to proceed |
user.create | Creates an account and emails an activation link | Strong — confirm and type the username back |
fail2ban.unban | Removes a Fail2Ban ban for a given IP address | Confirm to proceed |
backup.trigger | Starts a backup of a chosen type | Confirm to proceed |
app.update | Updates an installed app to its latest version | Confirm to proceed |
quota.enable / quota.disable | Turns storage-quota reservation on or off install-wide | Confirm to proceed |
quota.set | Sets a single user's storage allowance in GB | Confirm to proceed |
geoblock.disable | Turns off geo-blocking install-wide | Confirm to proceed |
network.speedtest | Runs a download, upload, and latency test against the network test server and reports the result | Confirm to proceed |
When you create a user from chat, you give only a username and an email address — never a password. QBxBot creates the account and emails the new user an activation link so they set their own password. No password is ever typed into, or sent back through, the chat.
Banning a user and creating a user are the two highest-impact actions, so they use a stronger confirmation: QBxBot replies with a short-lived code, and to go ahead you reply with both the code and the target username (for example, CONFIRM 1a2b3c alice). A mistaken tap or a single stray reply can never complete one of these on its own.
Available commands
You do not have to guess what works. The Command Channel section of your Profile shows an Available commands list of exactly what you can run on this install — already filtered to what your administrator has exposed and what your role allows. A command whose underlying feature is not present on the install (for example, the VPN check when no VPN is set up) is shown greyed out with a short reason, so the list never offers something that would not work.
Custom aliases
An alias is your own shortcut name for a command you are allowed to run, so a longer command becomes a single word — for example, an alias called killplex that maps to restart plex. You build aliases from the Command Channel section of your Profile: pick a command from your available list, name the alias, and fill in any details it needs (such as the app). An alias is only ever a shortcut to a command you are already authorized for — it can never reach a command outside your permissions, and any confirmation a command requires (like stop or restart) still applies when you run it through an alias.
Cross-user aliases (administrators)
Administrators can build aliases that run a command against another user’s apps, from the Cross-User Command Aliases area of the admin Command Channel tab. You pick the target user and a command, and the alias is saved for that user. The command runs as you, targeting the user you chose, and only apps both you and that user have installed are offered.
QBxBot’s avatar
QBxBot ships with the official QBXWatcher mascot as its avatar. Administrators can replace it with their own image from the bot avatar slot in the Asset Management Center branding panel. Provide a square image (PNG, JPG, or WebP); it is cropped to a square for use as the bot’s avatar.
Security
The Command Channel is deliberately narrow and layered:
Closed command set
QBxBot can only run a fixed list of commands an admin turned on — never arbitrary or shell commands
Layered authority
Your verified account, your role and own apps, the right administrator permission, and a valid Local API Key must all line up
Confirmation for every change
Stop, restart, and every administrator action require a confirmation reply; banning or creating a user needs the stronger type-the-target confirm
Kill switches
An install-wide switch and your own per-account opt-out both shut the channel off instantly
Key-bound
Rotating or clearing the bound Local API Key disconnects the link automatically
Rate-limited and audited
Commands are rate-limited, and every attempt and outcome is written to the audit log
The most sensitive and irreversible operations are simply not in the catalog at all, so no configuration can ever expose them. Rebooting or shutting down the server, deleting a user, running raw database queries, editing configuration files directly, impersonating another account, and shell or terminal access stay dashboard-only by design. The Command Channel can only ever do the deliberately small, bounded set of actions above.
Disconnecting
You stay in control of your own link:
- Opt out turns the channel off for your account without removing your link — commands are simply ignored until you opt back in.
- Unlink removes the binding entirely. To use the channel again you link your account from scratch.
An administrator’s install-wide kill switch overrides everything: when it is off, no command runs for anyone.
Messaging platforms
Discord and Signal are equal, first-class ways to command your install. The command catalog, the off-until-enabled gating, the key binding, QBxBot’s avatar, and the outbound-only reachability are all the same no matter which platform you use.
- Discord — One bot powers everything. An administrator creates a Discord application with a bot, enables its Message Content intent, gets the bot into a server its users share, and pastes the bot token into the install. That single token both receives commands and sends alerts. Users then link their Discord account.
- Signal — An administrator gives QBxBot a Signal identity — by Link Device (attaching to an existing Signal account by QR scan, recommended) or Register Number (claiming a dedicated number with a captcha and SMS code) — then arms Signal. Users then link their Signal account by DMing a code to QBxBot’s number, exactly like Discord.
You can enable one platform or both. Whichever you use, linking works the same way: get a code in the dashboard, DM it from the account you want to command with, and the link verifies automatically. After that, the commands you send are identical.
Best practices
Do
- Expose only the commands you actually want available — keep the catalog tight
- Use a read-scoped Local API Key if you only need status checks
- Prefer a database-stored Local API Key so rotation disconnects links cleanly
- Review the command audit log periodically to see what has been run
- Use the per-account opt-out to pause your own access whenever you want
Don't
- Don't share your linked messaging account — control of that account is control of your apps
- Don't expose more commands than your users need
- Don't forget that rotating the bound API Key requires re-linking before commands work again
FAQ
Related pages
Configure the Discord bot and enable the Command Channel for your install
Generate and manage the Local API Keys that links are bound to
Customize QBxBot's avatar in the branding panel
Opt in, link your account, and manage your command aliases
Join the Community
Media server operators sharing configs, getting support, and shaping the future of QuickBox Pro.