Security
User Allowlist
By default, any user who can send messages to your bot can create sessions. To restrict access to a specific set of users, populate security.allowedUserIds in your config:
"security": {
"allowedUserIds": ["123456789", "987654321"]
}Values are platform user IDs as strings. For Telegram, this is the numeric user ID. For Discord, it is the user snowflake.
When the list is non-empty, SecurityGuard.checkAccess() rejects any incoming message whose userId is not in the list. The user receives no response (the message is silently dropped). An empty list means all users are allowed — this is the default and is appropriate when your bot is in a private group that only you can access.
To find your user ID:
Telegram: Message
@userinfobotor@getidsbot.Discord: Enable Developer Mode in Settings, then right-click your username and select "Copy User ID".
Concurrent Session Limits
"security": {
"maxConcurrentSessions": 20
}This is a hard cap on the number of sessions with status active or initializing across all channels at any given moment. When the limit is reached, new incoming messages are rejected with a "Session limit reached" response until an existing session completes.
The default of 20 is generous for personal use. Reduce it if you are on a machine with limited resources or want to prevent accidental runaway usage.
Session Timeout
Sessions that have been idle (no new prompt sent) for longer than this value are eligible for automatic cleanup. The default is 60 minutes.
API Bearer Token
The local REST API (default port 21420) is protected by a bearer token. The token is stored in:
This file is created automatically on first start with 0600 permissions (owner read/write only). The token is a 64-character hex string generated with crypto.randomBytes(32).
At startup, if the file permissions are more permissive than 0600, a warning is logged:
To authenticate API requests, include the token in the Authorization header:
The CLI reads this file automatically when talking to a running daemon, so you do not need to manage it manually for normal use.
Do not expose the API port externally. The default host: "127.0.0.1" binding ensures the API is only reachable from localhost. If you change api.host to 0.0.0.0, the server logs a warning — ensure your firewall blocks external access to port 21420.
Dangerous Mode
Some agent operations (file writes, command execution) require explicit user approval via permission request buttons in the chat. This is the default behavior. For details on how permissions work from a user's perspective, see Permissions.
If an agent is configured to run without permission prompts (agent-side configuration), ensure your allowlist is restricted to trusted users only, since any allowlisted user will have the ability to trigger unrestricted agent actions.
Best Practices
Always set
allowedUserIdsunless your bot is already in a fully private, access-controlled group. Even a private Telegram group can have its invite link shared accidentally.Keep
api-secretat0600. The CLI warns you if it is not. Runchmod 600 ~/.openacp/api-secretif needed.Do not change
api.hostto0.0.0.0unless you have a specific need and have locked down port21420with firewall rules.Review
maxConcurrentSessionsif you share the bot with multiple users. A session per user is reasonable; 20 concurrent ACP agent subprocesses can be resource-intensive.Rotate the API secret by deleting
~/.openacp/api-secretand restarting the daemon. A new token is generated automatically.Use daemon mode with autostart for persistent deployments so the server does not silently go offline after a reboot.
Last updated
Was this helpful?
