docs / security & privacy

What runs where, and what leaves your machine.

Balladeer's terminal client installs on your machine. This page covers what it puts there, what leaves and what never does, who can see what, which model vendors touch your data, how one workspace is kept out of another, and how to leave. The Claude and ChatGPT connector installs nothing.

On your machine

The installer puts a small client on your machine and wires it into how you already work. Concretely:

What leaves, and what never does

What syncs to your workspace on Balladeer's hosted server:

What never leaves your machine:

Text on its way into your workspace passes a scrubber that redacts common secret formats (API keys, tokens, private keys) before anything is stored, embedded, or sent to a model. It is pattern-based and best-effort, so treat it as a safety net rather than a guarantee: a credential in an unusual shape can still get through.

Who can see what

A decision is visible to your whole workspace by default. It can instead be private to the person who recorded it, or restricted to named people. Restriction fails closed: to anyone outside the audience, a restricted decision is indistinguishable from one that does not exist.

That holds for more than the decision itself. The counts on your status line are filtered, because a count that moves when a hidden decision is added is itself a disclosure. Links are filtered too: relating two decisions requires that you can see both, so the relationship verbs cannot be used to test whether a hidden decision exists.

How one workspace is kept out of another

Balladeer is multi-tenant, and the separation is enforced by the database rather than by application code remembering to filter. Every table that holds your content carries your workspace id and runs under Postgres row-level security, forced on, with a policy that admits only the workspace the current request belongs to. The application connects as a least-privilege role that cannot bypass those policies, and the workspace identity is set per transaction, so a pooled connection can never carry one tenant's identity into the next request.

A short list of infrastructure tables sits outside that scheme, because they are read before a workspace identity exists (the accounts, memberships, and device records that establish who you are) or because they have no tenant dimension at all. None of them holds decision content, and a test fails the build if a new table appears in neither club.

Which models and vendors touch your data

Two vendors process workspace content today, and they are separate answers.

Where your secrets are kept

Credentials you entrust to Balladeer are encrypted at rest with AES-256-GCM under a master key that lives only in deploy secrets, so the database and its backups never hold a usable key. That covers your workspace's model key and the token for a connected Slack workspace. Each sealed value is bound to the row it belongs to, so a ciphertext moved to another workspace's row fails to open rather than decrypting into the wrong tenant. If a value cannot be sealed, it is refused rather than stored in the clear.

Connected apps

Our own operational alerts carry workspace names and aggregate numbers (volumes, error rates, spend). They never carry decision content.

What we keep to ourselves

What Balladeer returns to your team is what your team wrote, its standing, and human-readable receipts (which merged PRs cite a decision, how recently it was load-bearing). The machinery underneath (retrieval scoring, ranking signals, the pipeline's internal bookkeeping) is not part of any customer-facing payload, so your tooling can't come to depend on internals that change.

What Balladeer does not do

Leaving

Two different things, so they are worth separating.

Your machine: balladeer uninstall removes everything setup installed. It unwires the agent config and status line, removes the client, and moves your local data directory to a timestamped backup rather than deleting it. Destructive removal exists but asks you first, and the backup is the default, so leaving never costs your team the record.

Your hosted workspace: uninstalling touches your machine only and removes nothing from the server. Erasing a workspace's hosted data is not self-serve today; email us and we do it. There is no automatic deletion timer, so a workspace you stop using stays as you left it until you ask us to remove it.

Verified from live product as of 4 Aug 2026.