Skip to content

Security

Your PDFs never leave your browser.

Not "encrypted in transit." Not "stored briefly." Not at all. The PDF bytes are parsed, edited, redacted, and signed inside the browser tab you have open. The server never sees them — and most of the time, the server isn't even contacted.

This page documents what runs where, what we encrypt, and exactly how you can verify our claims yourself.

What stays local, what touches our server

The honest, two-column truth. The left column is the work you do on your PDF; the right column is what (if anything) leaves your browser to do it.

What you're doingWhat leaves your browser
Filling a form (manually)Nothing. PDF + your typed values stay in-page.
Signing yourself (one-click)Nothing. Signature image is rendered + flattened into the PDF locally.
Redacting (manual selection)Nothing. We draw black rects locally and re-save.
Merging, splitting, rotating pagesNothing. pdf-lib in your browser.
OCR (making a scan searchable)Nothing. Tesseract.js runs in your browser; the trained language data is a static asset served once from our CDN, not your scan.
Auto-fill from your saved profileForm-field names + types (e.g. "first_name" / text) + your profile values. Not the PDF bytes. Sent to a third-party AI provider to compute the mapping. We don't log it.
AI redaction suggestions ("Scan for PII")Extracted text spans (e.g. "123-45-6789"). Coordinates stay local. Sent to a third-party AI provider; not logged. PDF bytes never sent.
AI clause reviewExtracted document text (no coords, no bytes). Sent to a third-party AI provider; not logged.
Counsel Mode (Pro / Max)Nothing leaves your machine. AI runs against a local Ollama instance you control. The cloud AI provider is not invoked.
Send for signatureCiphertext only — see below. Key never touches our server.
Signing in / payingEmail (Better Auth), payment metadata (Stripe). Standard.

Bold rows are the only paths where any document-derived data leaves your machine — and even then, only text we've extracted client-side, never the PDF itself. You can confirm this by opening DevTools → Network and watching what gets sent.

How send-for-signature stays end-to-end encrypted

Send-to-sign is the only flow where your PDF visits our server at all — and only as opaque bytes we can't read. The flow:

The trade-off, stated plainly. Anyone holding the full link (including the fragment) can decrypt and sign. Treat the link like a password — share via a secure channel, don't paste in public chats, and let pending requests expire when they're no longer needed.

Cryptography in use

Compliance posture (the honest version)

We're pre-launch and don't yet have third-party attestations. Here's what we do have, and what we don't:

Trust, but verify

Don't take our word for it. Every claim above is something you can check yourself in a few minutes:

1. Open the network tab while you work

DevTools → Network → load https://attachkit.com/app/sign → drop a PDF. Filter by "Fetch/XHR." You'll see the page loads and the PDF.js worker; you will not see your PDF being uploaded. Click Sign, type, save — still no PDF upload. This is the simplest one-minute proof.

2. Inspect the request bodies on AI paths

For Auto-fill, click the API call to /api/autofill → Payload tab. You'll see fields + profile as JSON — no PDF bytes. Same for /api/redact (text spans, no bytes) and /api/clause-review (document text, no bytes, no coordinates).

3. Pull the page offline and watch it still work

After loading /app/signonce, open DevTools → Network → throttle to "Offline" → drop a PDF → sign → download. It works. (The AI features will fail, since they need the network; everything else doesn't.)

4. Read the code

The PDF parsing + editing path is src/lib/pdf/*.ts + the in-browser pdf-lib / pdfjs-distimports. There's no "upload the PDF" codepath to grep for, because it doesn't exist. The AI endpoints in src/app/api/* take the shapes we describe above; no path accepts raw PDF bytes from a non-send-to-sign caller.

Reporting a vulnerability

Found something? Use our contact form and pick “Security vulnerability.” We acknowledge inside one business day and work the fix with you. No formal bug bounty yet, but we'll credit responsibly-disclosed findings if you want.

For pre-launch we don't have a separate security alias, PGP key, or HackerOne program — when those exist, this page is where we'll publish them.

Privacy · Terms · DPA · Contact