Trust center

Security, in enough detail to answer a review.

This page exists so a security questionnaire does not need a meeting. Every control below says how it is enforced, not that it matters. The full write-up, with the file and test names behind each claim, is in the repository as docs/security.md.

What we do not have

Stated here rather than discovered later. We hold no certification of any kind, and nothing in this product or on this site claims otherwise — there is a test that fails the build if it starts to.

SOC 2 Type I / Type II
No report. The evidence pipeline is built — access review, chain integrity, a machine-readable export — our own audit is not done. It is planned against a customer requirement, not a calendar.
ISO 27001
No certification, and none in progress.
Third-party penetration test
Not yet performed. An internal security review was done in September 2026 and its findings are fixed, each one turned into an invariant with a test.
Signed BAA / HIPAA
Not offered.
SSO, SAML, SCIM
Not built. TOTP second factor is.
Bug bounty
None. Disclosure is by email, and we will not threaten a researcher acting in good faith.
24×7 on-call, contractual SLA
Not offered at the self-serve tiers.
01 / ISOLATION

Your data is separated by the database, not only by our code

Application-level scoping is the kind of control that fails silently the day someone forgets a WHERE clause. So it is backed one layer down.

Row-level security, forced

Every tenant-scoped table has RLS enabled and FORCED, with a policy that reads the scope set on the connection. A query that forgets its predicate returns nothing — not another tenant's rows.

The server refuses to start without it

A superuser bypasses RLS unconditionally, so the application must connect as an ordinary role. That is verified at boot, and in production a missing backstop stops the process rather than logging a warning nobody reads.

Proven against a real database

Isolation is tested adversarially per resource — tenant A attempting to read, mutate and delete tenant B's data — against real PostgreSQL, with the suite connecting as an unprivileged role so it cannot pass by accident.

02 / SENSITIVE DATA

Personal data is masked before it is stored — and before it leaves the browser

Redaction that runs after storage protects nothing. This runs twice, and fails closed both times.

Masked in the browser first

The capture agent detects and masks in the page, so the raw value never crosses the network. Detectors cover email, phone, credit card (Luhn-validated), CPF/CNPJ, SSN, IBAN, plus your own patterns.

Enforced again on ingest

The agent is code running in your page, so the client pass is defence in depth and the server pass is the enforced one. Every ingest surface goes through the same enforcer.

The two engines cannot drift

Both assert against one shared fixture, so a detector changed on one side fails the other's test.

Fail closed

No policy, an unparseable policy, or a missing redaction script all fall back to the strict default. One uncompilable custom pattern is dropped by itself rather than disabling the built-ins.

Versioned, append-only policy

Which rules were in force on the day of a given capture is answerable, not reconstructed.

03 / THE RECORD

An audit trail that can be checked, not just trusted

A log an administrator can edit is not evidence. This one is append-only and each entry is chained to the one before it.

Hash-chained and append-only

Each row chains by SHA-256 over the previous hash and the canonical event. There is no update or delete path, and verification recomputes the chain — any altered or removed row fails it, visibly, on the console.

Anchored outside the database

The chain head is emitted to your centralized logs hourly. Because those ship off-database, the anchor detects tampering at the database level — including by a privileged actor.

Exportable as evidence

Access review and chain integrity as a console, a CSV, and a machine-readable endpoint a GRC tool can poll. The export records its own audit event.

04 / ACCESS

Least privilege, and a way to revoke

Passwords and second factor

Argon2id with a server-side pepper; TOTP second factor, with its secret encrypted at rest. MFA failures count toward the account lockout, because six digits are brute-forceable.

Raw session capture is gated separately

Viewing a recorded session is its own permission, not implied by reading a bug — and a new member does not get it. Each view is audit-logged.

Sessions can be killed

Every token carries an epoch; a password or MFA reset bumps it and every outstanding session stops working immediately.

Brute force is bounded across instances

Per-IP limits and per-account lockout are shared through the database, so a second replica does not silently double the allowance. The lockout stores a hash of the address, never the address.

05 / WHERE IT RUNS

The deployment model decides most of the answers

Self-hosted is a single static binary plus your PostgreSQL: no agent, no sidecar, and no outbound call you did not configure. If your review would fail on "a vendor holds our production logs", that is the mode to evaluate.

Region pinning

Each workspace is pinned to a region and a deployment serves one. A write whose pin does not match is rejected. The settings screen stays reachable, so the pin is always correctable.

Bring your own model

The AI provider is per-workspace, including a local model that never leaves your network. Every request carries a no-train opt-out signal.

Retention you set, deletion that is real

A capture past the window is hard-deleted and the purge is audited. Deleting a record removes its artifacts, because they are columns rather than references. Dead-lettered payloads are purged with the logs — they hold raw input that never passed through redaction.

Reporting a vulnerability

Write to security@insightrecorder.com. We will acknowledge the report, tell you whether it reproduces, and tell you when it is fixed. No NDA is required to report, and we will not threaten a researcher acting in good faith.

HISTORY

What we have found, including in ourselves

In September 2026 an internal review produced a list of findings — origin pinning for emailed links, proxy header trust, credential segments redacted from access logs, session revocation, timing-equalized authentication — all fixed, each one now an invariant with a test.

In the same period we found and fixed a cross-tenant notification leak in our own code, before any customer was affected: a detached goroutine dropped the request's tenant, so one workspace's alert could resolve another workspace's credentials. We publish it because how a vendor handles the bug it found itself is the most useful thing a reviewer can know about it.