Security as proof

Last updated: 2026-07-13

The moment a brain is writable from the outside (a synced notes folder, a marketplace pack, an agent) it becomes the target of memory-poisoning attacks. RepoOps answers that risk with code you can point at, and a standing red-team suite that attacks that code in CI on every change. Every claim below links to the exact shipped module that backs it. No claim ships here that does not resolve to code, the same truth-audit discipline behind our Verified Memory page.

Encrypted vault, not a plaintext .env

A known weakness in comparable tools is storing secrets in a plaintext .env file that any process on the machine can read. RepoOps does not. Connector credentials and app secrets are encrypted at rest with AES-256-GCM before they reach storage, and encryption fails closed when the key is unconfigured in production, so a misconfigured deploy never silently falls back to plaintext.

Every posture claim, linked to code

Each row states a claim and names the module that implements it. The module paths are the receipts.

Secrets are stored in an encrypted vault, not a plaintext .env.

Connector credentials and app secrets are AES-256-GCM encrypted before they reach the database, with a per-value random IV and a GCM auth tag. Encryption fails closed if the key is unset in production, so a misconfigured deploy never silently stores plaintext.

website/lib/secret-box.tswebsite/lib/connectors/crypto.ts
Every write to a person's brain is trust-tiered (write-trust).

A write from a trusted owner surface lands active; a write declaring an external source lands proposed, invisible to every reader until the owner confirms. No write can assert its own trust tier.

website/lib/personal-write-guard.tslib/sync/folder-connector.mjs
Marketplace packs are signed, and unsigned or untrusted packs are refused.

Packs are ed25519-signed; the installer verifies the signature against the receiving brain's trust list and rejects an untrusted signer or a tampered bundle with no skip path. Nothing is written on a failed verdict.

lib/federation/signing.mjslib/federation/pack-installer.mjs
Secrets and PII are redacted before any capture is persisted.

The connector and telemetry paths run every payload through the shared redactor (API keys, tokens, private keys, connection strings, cards, emails) before a byte is written to the brain.

lib/redact.mjs
A marketplace install activates nothing until an explicit human approve (HELD).

A verified pack lands as one inert proposed note. It is invisible and runs nothing until you approve it on the Marketplace tab; reject deletes it and leaves no trace.

lib/marketplace/install-held.mjs
A standing red-team suite attacks these defenses in CI on every change.

Adversarial fixtures (poisoned pack, poisoned connector payload, prompt-injection-shaped proposal, tampered signature) assert each defense fails closed. The suite runs in the required checks job, so a regression that opens a gate fails the build before it can merge.

lib/security/redteam/redteam.test.mjs

The memory-poisoning red-team suite

A standing suite (lib/security/redteam/redteam.test.mjs) runs in our required CI checks job. It builds four adversarial fixtures the way a real poisoning campaign would shape them and asserts each defense fails closed: the poison is rejected, redacted, or held for an explicit human approval, and never becomes an active memory. A regression that opens any gate fails the build before it can merge.

poisoned-packfails closed

Attack. A marketplace pack signed by a signer the receiving brain does not trust.

Defense. installPack rejects with untrusted-signer and writes nothing to the imported/ store.

lib/federation/pack-installer.mjs
poisoned-connector-payloadfails closed

Attack. A synced notes file carrying live secrets (AWS key, Slack webhook) and an injection.

Defense. Every secret is redacted before persistence and the note lands as a proposed review record, never an active memory.

lib/sync/folder-connector.mjs
injection-proposalfails closed

Attack. A marketplace-install proposal whose fields carry a prompt injection and a comment-closer.

Defense. The install stays held, the machine marker survives the injection intact, and any non-approve decision fails closed.

lib/marketplace/install-held.mjs
tampered-signaturefails closed

Attack. A trusted signer's pack whose bundle bytes are mutated after signing.

Defense. verifyBundle returns signature-invalid and installPack writes nothing.

lib/federation/signing.mjs

What the suite does not test. Truth-audit discipline means naming the boundary, not just the coverage:


Vulnerability disclosure

RepoOps is operated by PromptReports LLC, an Illinois limited liability company. We take the security of the desktop app and the hosted surfaces at repoops.ai seriously. The rest of this page describes how to report a vulnerability responsibly.

1. Reporting a vulnerability

If you believe you have found a security vulnerability in RepoOps, please email security@repoops.ai. Include enough detail for us to reproduce the issue: the affected surface, a description of the impact, and step-by-step reproduction instructions or a proof of concept. If you need to share sensitive details, ask us for a way to exchange them securely and we will arrange one.

Please report privately and give us a reasonable chance to fix the issue before any public disclosure. Do not open a public GitHub issue for a suspected vulnerability.

2. Our response commitments

3. Scope

In scope for this policy:

Out of scope:

4. Safe harbor

We will not pursue or support legal action against researchers who, in good faith, discover and report a vulnerability in accordance with this policy. To stay within safe harbor:

If legal action is initiated by a third party against you for activity that complied with this policy, we will make it known that your actions were authorized. This policy does not authorize testing that violates applicable law.

5. What to expect from a good report

The most actionable reports include: the exact URL or surface, the type of issue (for example, injection, broken access control, or token handling), the impact if exploited, reproduction steps, and any supporting logs, screenshots, or a short proof-of-concept. Please do not include real third-party personal data in your report.

6. Our security posture

The desktop app runs entirely on your machine and does not transmit the content of your repos to RepoOps servers unless you explicitly bind the install to a hosted team. Brain Dreaming and Ask synth call the Anthropic API directly from your machine using your own API key (BYOK), so we never see your prompts or completions. For the hosted surfaces we apply encryption in transit (TLS 1.2+), encryption at rest (provider-managed), least-privilege access, audit logging, and vulnerability management. Full data-handling terms are in the Data Processing Agreement and the Privacy Policy.


A machine-readable version of our security contact is published at /.well-known/security.txt per RFC 9116.

See also: Terms of Service · Privacy Policy · Data Processing Agreement.