Permissions & security.
Scripts run in a sandbox and start with zero powers. You grant each capability per script, sensitive actions ask before they run, and everything, your scripts and their data, stays on your machine.
Every script starts locked
Whether you wrote a script, imported one, or generated it with AI, it begins with no capabilities. It can react to events, log, and store data, but it cannot touch your keyboard, OBS, the network, or your chat until you say so. You grant capabilities per script, so one script being allowed to press keys says nothing about any other.
Granting a capability
When a script first needs a power you have not granted, the Companion asks with an Allow or Deny prompt naming the script and the capability. Allow it and that script keeps the power; deny it and the action is refused. You can review and change every grant later on the script's permissions panel, and revoke all for a script in one click.
Until a power is granted, a call that needs it is refused at the gate: it never runs, and the console names the missing capability so you know exactly what to grant.
macOS Accessibility
Pressing keys, typing, and firing hotkeys go through your operating system, so on macOS a script that uses input also needs the one-time Accessibility permission (System Settings, then Privacy & Security, then Accessibility). Until you grant it, input actions are refused and the console says exactly that. This is separate from the in-app capability, and it is the same permission any macro tool asks for.
A script you did not write can do anything you grant it. Read what it does first (the editor and the transparency panel list every action and event it touches), then grant only the capabilities it genuinely needs.
What stays on your machine
Your scripts, their stored data, and their granted permissions live locally in the Companion, not in the cloud. The app only holds a device token scoped to your channel, enough to read your events and chat and to send chat for a script, and never your Twitch password. Revoke a device from Settings, then Connections and it can do nothing more.