Backstop
backstop.family / subpoena

If we get subpoenaed, here is everything we can hand over. This is the whole list.

Nothing is hiding elsewhere. Backstop's servers were designed so that a subpoena, a warrant, a leak, a rogue employee, or a compromise of our cloud provider all yield the same thing: metadata and ciphertext we can't decrypt. What follows is the exact inventory.

The complete list of what's on our servers.

Everything below is stored on our control plane in Postgres. Some of it we need to route your alerts and bill you; some of it is ciphertext we can't read without a key we've never had.

Identity
  • Your email address The address you signed up with.
  • An opaque Firebase Auth user id A stable identifier issued by Google. Not your password. See Where else to look below.
  • Sign-in provider Either password or google.com. Which one you used to create the account.
  • Account timestamps Created, last logged in, last token refresh.
  • TOTP ciphertext, if you enabled two-factor The 2FA seed is envelope-encrypted with a key derived from your login. We can't decrypt it without you.
Endpoint devices
  • Per-device label you picked e.g. jvs, MacBook — Sam. Whatever you named it in the app.
  • Platform + agent version e.g. macos-aarch64 / v0.0.57.
  • Heartbeat timestamps When each device last checked in. Retained ~90 days.
  • Device fingerprint A local-only hash the endpoint computes to detect duplicate enrollments.
  • Enrollment PKI records Public cert issued to the device, revocation entry if the device has been removed.
Alerts
  • Alert id + timestamp When each alert fired.
  • Which endpoint sent it Alert → device linkage.
  • A coarse severity bucket Two values, routine or urgent. That's the whole enum.
  • Ciphertext of the alert body ChaCha20-Poly1305, encrypted on the endpoint with a key we've never seen. We store bytes and can't read them.
Configuration
  • Ciphertext of your taxonomy, blocklists, cadence The rules that decide what counts as an alert. Opaque to us. Ships from your PWA to your endpoints; we relay bytes.
  • Version number of each config Endpoints ask "give me anything since version N." We answer with ciphertext.
Notification routing
  • Channel + destination you chose e.g. "SMS to +1-555…", "email to you@example.com", or a browser push subscription URL. We need these to deliver the "you have an alert" ping.
  • Delivery ledger When each notification was enqueued, dispatched, whether it delivered, and — for SMS/email — a content-free preview like "You have a new Backstop alert."
Billing
  • Stripe customer id + subscription id Stripe's identifiers, not your card. We use them to look you up in Stripe.
  • Plan, status, trial end, current period end Whether you're on monthly, annual, trial, active, past-due, or canceled.
Operational
  • Request-level logs from Cloud Run Method, path, status, duration. No bodies. Retained per Google Cloud defaults.
  • Postgres itself, at rest Hosted at Neon; encrypted at rest. A subpoena to Neon reveals the same rows listed above — same ciphertext.

These never touch our servers. By design.

Screenshots. Captured on your child's laptop, sent directly from the endpoint to your BYOK LLM provider under your own API key, deleted from the endpoint after the LLM answers. They never touch Backstop infrastructure. There is no bucket, no cache, no queue.
Your LLM provider API key. Stored on the endpoint's OS keychain (macOS Keychain, Windows Credential Manager). Backstop's servers never receive it.
Alert content in the clear. Every alert is encrypted with your family key before it leaves the endpoint. We store ciphertext.
Configuration content in the clear. Your taxonomy, your blocklist, your cadence — encrypted end-to-end. We route ciphertext.
The family key itself. Derived on your device from your BIP-39 mnemonic. Never transmitted, never persisted server-side, never in a log.
Your password. Backstop's servers hold no password hash. Password storage is Firebase Auth's job (see below); we get an ID token, verify its signature, and issue our own session token.
Payment card details. Held by Stripe, not by us. We store Stripe's opaque customer id; the card is Stripe's business.

Third parties in your account's supply chain.

Backstop is not the only service touching your account. A subpoena to Backstop cannot produce what these other companies hold, so we name them explicitly.

Google (Firebase Auth)
Your password hash (scrypt), your sign-in history, linked OAuth providers if you chose "Continue with Google". Governed by Google's legal-process response. Backstop cannot access your password hash and has no ability to reset your password — Firebase does that directly.
Stripe
Your name, billing address, card last-4, invoices, subscription events. Governed by Stripe's legal-process response. We initiate Checkout on your behalf; Stripe holds the card.
Your BYOK LLM provider (OpenAI, Anthropic, Google, or an OpenAI-compatible endpoint you pointed us at)
Every screenshot the endpoint sends for analysis reaches this provider under your account and your API key. They are the account holder, not Backstop. Their retention + logging policy applies. If a screenshot ever existed at rest away from your child's laptop, it existed here.
Neon (our Postgres host)
Row storage for everything in the inventory above. A subpoena to Neon returns the same rows — including the ciphertext that Backstop also cannot read.
Google Cloud (Cloud Run + Secret Manager)
HTTP-level request logs, our container images, our secrets. Would not surface family data beyond what Neon already holds.

We can't hand over what we don't have. The architecture predates any subpoena.

The other products in this category have to negotiate with law enforcement about which alerts to disclose, which screenshots to pull from the cloud, which DMs to hand over. Backstop doesn't, because those things don't exist on our servers to begin with.

The trade-off is real: our servers cannot help you recover an alert if you lose your recovery mnemonic. That's not a bug we're working on — it's the same property that makes this page short.