Skip to content
Tendrounds

SECURITY AND ACCESS · DESIGN v1 · OCT 2026

What Tendrounds can see, and what it can't.

We hold read access to many client databases, so our first design goal is that a compromise of Tendrounds must not turn into write access to yours. This page lists every permission we ask for and every limit we know about. Tendrounds is in early access; this describes how the product is built, and we update it when that changes.

Summary

Supabase platformRead-only OAuth scopes. No write scope, no Secrets Read.
Supabase databaseA read-only role you create and can revoke at any time.
VercelProject and deployment status, env var names. Never values.
Production URLPublic HTML and JS. Anon-key row counts, never rows.
CredentialsEncrypted with AWS KMS. The web app can encrypt, only the worker can decrypt.
BackupsEncrypted per workspace, retention-locked, owner download only.

Supabase OAuth scopes

We connect through Supabase's OAuth app flow and request read access to Projects, Database configuration, Storage (bucket settings), Auth configuration and Organizations, plus advisors_read for Supabase's own security advisor.

We don't request Secrets Read, because it would expose your API keys, or any Write scope. Database Write is what allows arbitrary SQL through the Management API, so we never ask for it.

The read-only database role

SQL-level checks and backups use a role you create with Supabase's documented backup-role recipe. The password is generated in the app and shown once.

create role tendrounds_reader login password '<generated in-app, shown once>' bypassrls;
grant pg_read_all_data to tendrounds_reader;
alter role tendrounds_reader set default_transaction_read_only = on;

We test the connection and confirm the role isn't postgres and that read-only is on.

Limits we state openly

  • The role can read all data. That's what a backup is.
  • Supabase documents that a session can switch read-only off itself, write to the pg_net queue if pg_net is enabled, and create large objects.
  • So the worker sets SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY, runs only an allowlisted set of catalog queries plus pg_dump, and builds no SQL from strings. A CI test fails the build if any check file contains a write statement.
  • Prefer checks without backups? Use the same role in “checks only” mode and we never schedule a dump.

Vercel integration

Installed with a project allowlist you choose. We read projects, deployments, production domains and environment variable names and targets. We can't read env var values, deploy, or change team settings.

Credential encryption

Every credential is encrypted with one AWS KMS key under an encryption context of your workspace and connection. The web tier's role may only kms:Encrypt. Only the background worker's role may kms:Decrypt, at the moment it runs your round, and CloudTrail logs every decrypt. Secrets never go into task payloads, logs or error messages. Removing a connection deletes its ciphertext immediately.

Backup encryption and retention

Each nightly pg_dump is compressed and encrypted with AES-256-GCM using a fresh data key for your workspace, then stored in a Cloudflare R2 bucket with a retention lock, so it can't be deleted or overwritten early, even by us. Weekly restore tests run in a throwaway Postgres that is deleted after the test. Only workspace owners and admins can download a decrypted dump, through a 15-minute link, and every download is written to your audit log.

What the free scan does

The free scanner opens soon. When it does, it will only scan apps you own or have permission to scan, and only after you verify ownership with a meta tag, a file at /.well-known/tendrounds.txt, a DNS TXT record or the Vercel integration.

It doesFetch your public HTML and same-origin JS (max 40 files, 15 MB) and look for privileged Supabase keys and third-party secrets.
It doesSend HEAD requests with your public anon key and Prefer: count=exact to count rows in common table names. No GET, so no row data.
It doesCheck for public storage buckets, and your TLS certificate and domain registration expiry.
It doesn'tUse any key it finds except the public anon key, and only for counts.
It doesn'tWrite anything, follow redirects to private networks, or crawl behind a login.
It doesn'tStore secrets. Anything found is shown masked (first 8, last 4 characters).
Limits3 scans per email per day, 10 per network per day, 1 per domain per hour. Results are deleted after 30 days.

Reporting a vulnerability

Found a security issue in Tendrounds? Email security@tendrounds.com. We reply within two working days and credit you if you'd like.

Join the agency waitlist →