At a glance
This page describes Shield’s security posture in concrete detail. Each section answers a question you or your security team are likely to ask. If something is unclear, missing, or feels light, mail and we’ll respond within one business day.
Account metadata, plan + subscription status, aggregate usage counts, opaque API key hashes, tamper-event reports. Nothing else.
The source code or HTML you submit for obfuscation. The protected output. Your card number. Any data not strictly required to run your account.
Runs on AWS infrastructure via a SOC 2 Type II managed platform. Managed PostgreSQL, encrypted at rest. TLS, load balancing, and process supervision handled for us.
Stripe. Card data is collected by Stripe Elements directly inside their hardened iframe — it never touches our server. We see only the last 4 digits and brand.
How we handle your data
Our data minimization is deliberate. Every byte we hold is a byte that could be lost, leaked, or subpoenaed. We hold as little as possible to make Shield work.
Data we store
| What | Detail | Why |
|---|---|---|
| Account identifier | UUID, email, display name, username, optional avatar. Sign-in is passwordless — no password is used to authenticate. | Authenticate you (via one-time email links) and address you correctly. |
| Plan & subscription | Plan ID, subscription status, period dates, cancel-at-period-end flag — synced from Stripe via webhooks | Enforce quotas and surface your billing state. |
| Usage metadata | Per-obfuscation: timestamp, kind (JS/HTML), strictness level, byte counts, duration, anonymized 16-char IP hash. Bucketed per (user, calendar month). | Quota accounting and the History view. |
| API key hashes | SHA-256 of the secret portion only. The plaintext key is shown exactly once at creation time. | Authenticate API requests without recoverable storage of secrets. |
| Telemetry events | When you set a telemetry URL: reason code (integrity / debugger / headless / etc.), coarse geo, 16-char IP hash, user-agent substring. Hard-capped at 10,000 events per account; older events evicted automatically. | Power the threat-intel dashboard. |
| GitHub connection | Optional. Your Personal Access Token, encrypted at rest with envelope encryption + AES-256. | GitHub round-trip integration on Pro+ plans. |
| Stripe customer ID | A pointer (cus_...) into Stripe. No card data ever stored on our side. | Tie Shield account to Stripe customer. |
| Session records | Random 64-char session ID, user agent string, anonymized IP hash, last_seen timestamp. Hard expiry 30 days; idle expiry 10 minutes. | Single-session policy enforcement. |
Data we never store
- Source code submitted for obfuscation. Processed in-memory in the obfuscation engine and discarded when the HTTP response completes.
- Obfuscated output. Same path: returned to you in the response, not retained.
- Card numbers, CVCs, expiry dates. Collected by Stripe Elements in a domain-isolated iframe; we receive only a tokenized PaymentMethod ID.
- Plaintext API keys. Hashed at creation; the plaintext appears once on the screen and is then gone forever.
- Passwords. Sign-in is passwordless — we don’t use or store account passwords at all.
- Raw IP addresses. Hashed to a 16-character SHA-256 prefix at the moment of capture. The raw IP is not stored or logged.
We do not store your code
This is the question we’re asked most. The answer: source code submitted to Shield is processed in-memory and never written to disk or any database.
Concretely, the lifecycle of a single obfuscation request is:
- HTTPS request arrives at our managed edge (on AWS) and is routed to the Node.js service
- The service parses the JSON body into a JavaScript string in memory
- The obfuscation engine runs in a worker thread (off the main event loop, so one job can’t stall the service). AST parsing, transforms, defense injection — all in memory.
- The protected output string is JSON-encoded into the HTTP response
- The response is flushed to the network
- The strings are garbage-collected when the request handler returns
Only the metadata of the request — timestamp, kind, level, byte counts, duration, anonymized IP hash, your user ID — is persisted to the audit log table. The source and output bytes are not.
This is verifiable against our source code. The relevant endpoint handlers (e.g. app/api/obfuscate/route.ts) hold the source in a parameter, pass it through the engine (in a worker thread), return the result, and do not write it. We are happy to walk through this with your security team on request.
Account & authentication
Passwordless sign-in
Shield uses passwordless, magic-link authentication for every account — administrators included. To sign up or sign in you enter your email and receive a unique one-time link; clicking it confirms the address and starts your session. There is no password anywhere to leak, phish, guess, or reuse. Link tokens are 32 bytes of randomness, stored only as a SHA-256 hash, single-use, and expire in 20 minutes.
Sessions
Login creates a DB-backed session record with a cryptographically random 64-character session ID. AHttpOnly, SameSite=Lax, Secure cookie carries the ID; everything else (user_id, expires_at, user_agent, anonymized ip_hash, last_seen_at) lives in the database. Hard expiry: 30 days. Idle expiry: 10 minutes (rolling — any authenticated request slides the window).
Single-session anti-account-sharing: every successful login deletes all other sessions for that user. Two devices cannot be logged in simultaneously. Designed to deter password sharing across organizations.
API keys
Each key is a 32-byte random token, base-prefixed withshield_. We store the SHA-256 hash of the secret portion only. The plaintext key is rendered to your browser exactly once — at creation — and then irretrievable. Lost keys cannot be recovered; they must be re-generated. Revoke any time from Dashboard → API keys.
Signup abuse prevention
Because sign-in is passwordless, every account is provably tied to a reachable inbox. On top of that we reject disposable / temporary-mail domains at signup, and collapse the Gmail dot/“+tag” aliases that resolve to one mailbox so a single inbox can’t farm multiple free accounts. An input passing these checks still has to click a live email link before it can use the tool.
Encryption
In transit
Every endpoint serves over HTTPS. TLS is terminated and certificates are provisioned and rotated automatically by our managed edge; plain HTTP is redirected to HTTPS. The app publishes Strict-Transport-Security with a two-yearmax-age, includeSubDomains, and preload, alongside a set of hardening headers on every response: X-Frame-Options: DENY (anti- clickjacking), X-Content-Type-Options: nosniff, a strict Referrer-Policy, and a locked-down Permissions-Policy.
At rest
Storage encryption is provided transparently by our managed AWS platform: the PostgreSQL database and all managed volumes are encrypted at rest. Application secrets (Stripe keys, email keys, the token-encryption key) live in the platform’s encrypted environment variables, never in the code repository. Avatar images are stored in PostgreSQL, so the application keeps no local filesystem state.
Application-level protection is applied to sensitive values on top of storage encryption:
- API keys: SHA-256 hash (one-way)
- Magic sign-in link tokens: SHA-256 hash, single-use, 20-minute TTL
- GitHub PATs: AES-256-GCM (fails closed if the encryption key is unset — never stored in plaintext)
- Session IDs: not encrypted (entropy is the protection — 256 bits)
In memory
Sensitive values are not logged. The obfuscation engine receives source code strings and discards them when the request completes; we do not write them to stdout, stderr, or the database. Process memory is not deliberately zeroed (Node’s GC handles reclamation), which is a known trade-off documented here for completeness.
Application security
- Input validation: every public API endpoint validates its request body against a Zod schema before any logic runs; mismatches return a 400 with no further processing. User-facing validators (e.g. email format) use linear, backtracking-safe patterns to avoid regular-expression denial-of-service.
- CSRF protection: the GitHub OAuth flow rotates a single-use CSRF token via HttpOnly cookie. Stripe checkout calls use session authentication; no cross-site form posts are accepted.
- Rate limiting: the public playground (
/api/try) enforces a per-IP quota (5 / hour, 2 / minute, hashed IP). Login is throttled per-IP and per-identifier (DB-backed, checked before any expensive work); sign-up, magic-link requests, and password-reset requests are throttled to prevent email bombing and mass-account creation. Authenticated APIs are additionally gated by monthly plan quota. - Dependency scanning: GitHub Dependabot is enabled against our main repository. Vulnerable dependencies generate PRs we triage within one business day for high severity.
- Secret management: secrets live in the platform’s encrypted environment variables, injected at runtime and never committed to git. Stripe keys, the webhook secret, the email API key, and the token-encryption key are never logged.
- Security headers: HSTS (2-year, preload),
X-Frame-Options: DENY,X-Content-Type-Options: nosniff, a strict referrer policy, and a restrictive permissions policy are served on every response. - Isolation & availability: the CPU-bound obfuscation engine runs in a pool of worker threads, so a large job can never stall the main event loop or make the service unresponsive to other users.
- Change management: every code change is in git history with author + timestamp. our platform deploys automatically from the connected repository on each push; database migrations run as a pre-deploy step and abort the release on failure.
- Backups: PostgreSQL is continuously backed up with point-in-time recovery, complemented by periodic off-site logical dumps we control. Restore procedures are documented and have been tested end-to-end.
Infrastructure
Shield runs on AWS infrastructure through a managed platform that is SOC 2 Type II certified; AWS holds ISO 27001, SOC 1/2/3 and more. These are our providers’ certifications (see the note under Compliance). The stack:
| Layer | Technology | Role |
|---|---|---|
| Edge / TLS | Managed edge (AWS) | HTTPS termination, automatic certificates, load balancing |
| App runtime | Node 22 + Next.js 15 | Application server + dashboard (auto-deployed from git) |
| Obfuscation | Worker-thread pool | CPU-bound engine, isolated off the main event loop |
| Database | Managed PostgreSQL (AWS) | Users, sessions, subscriptions, usage logs, telemetry, API key hashes, avatars; encrypted at rest, PITR backups |
| Compute | Managed web service (AWS) | Single-region, no local disk state, rolling zero-downtime deploys |
Single-region by design: we run in one region for predictable latency and a simpler footprint. Multi-region failover is on the Enterprise-tier roadmap.
Subprocessors
These are the third-party services Shield uses to operate. Each is a tier-1 vendor with their own current compliance attestations:
Data shared: Tokenized card / PaymentMethod IDs only — full card numbers never reach Shield. Customer email + name + Stripe customer ID.
Data shared: Everything the application stores: the PostgreSQL database (accounts, sessions, subscriptions, usage, avatars) and runtime logs.
Data shared: Recipient email address and the message content (which contains a one-time link). No source code or billing data.
Data shared: Our own source code (private repo). For customers who opt in, a GitHub access token (encrypted at rest) used to read/write files in their repositories.
We do not use an analytics provider or a CRM. If we add a new subprocessor, this list will be updated and any change communicated to existing customers with 30 days’ notice.
Compliance & certifications
We are transparent about where we are in the formal compliance lifecycle. Our security posture is mature; formal attestations are an ongoing investment.
Our managed hosting platform is itself SOC 2 Type II certified — a provider control we build on, not a Shield attestation. Shield has no third-party SOC 2 report of its own yet: our data minimization (no customer source code stored, payments offloaded to Stripe) keeps the audit scope small, and we pursue Type I scoping when a specific enterprise prospect requires it.
EU customers are supported. We act as data processor for any personal data you provide. Data subject access requests can be made via our contact form and are answered within 30 days. See Privacy Policy.
California consumers have the same rights of access, deletion, and correction. Sale of personal information: we do not sell.
Card data is collected by Stripe Elements directly in their hardened iframe and never touches our server. Stripe is PCI DSS Level 1 certified. The applicable Stripe SAQ-A pattern means our PCI scope is effectively zero.
Shield is a code-obfuscation tool and does not handle Protected Health Information. Our Terms prohibit submitting PHI or other regulated data, and we do not sign Business Associate Agreements. Do not use Shield for data subject to HIPAA.
The AWS infrastructure we run on is ISO 27001 certified — a provider certification, not Shield’s own. Shield’s own certification is on the same roadmap as SOC 2, pursued when a specific Enterprise lead requires it.
If your organization requires a specific compliance artifact to evaluate Shield, please contact with the requirement and timeline.
Incident response
We follow a documented incident response process. The abbreviated version:
- Detect. Through monitoring, vulnerability disclosure, or customer report.
- Triage. Within one business hour of detection, classify severity (P0 — service down or data exposure; P1 — degraded; P2 — non-urgent).
- Contain. P0 / P1 incidents trigger immediate mitigation (block, rotate, take offline). Where customer credentials may be involved, we invalidate sessions.
- Eradicate & recover. Apply fix, restore service, validate.
- Notify. Affected customers receive direct email notification within 72 hours of incident confirmation. If the incident involves unauthorized access to personal data, we notify regulators where required by GDPR / CCPA.
- Post-mortem. A blameless post-mortem within 14 days of closure, with action items tracked to completion.
Report a vulnerability
We welcome coordinated vulnerability disclosure. If you believe you’ve found a security issue in Shield, please contact us before publishing or sharing details:
- · We acknowledge reports within one business day.
- · Triage and severity assessment within five business days.
- · We will not pursue legal action against good-faith researchers acting under coordinated disclosure.
- · Public credit on this page (with your consent) for valid, in-scope reports.
Out of scope
- Reports purely about missing security headers on marketing pages
- Self-XSS that requires the victim to paste hostile code into their own console
- Social engineering of Shield staff
- DoS / volumetric attacks
- Findings on third-party services (report those to the relevant vendor)
- Theoretical concerns without a reproducible exploit
We do not currently offer a paid bug bounty. We acknowledge publicly and credit researchers who help us in good faith.
Last reviewed: May 2026. This page is versioned in git and updated whenever our posture changes.