* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); min-height: 100vh; padding: 40px 20px; } .container { max-width: 900px; margin: 0 auto; } h1 { color: #2c3e50; margin-bottom: 6px; font-size: 28px; } .subtitle { color: #7f8c8d; margin-bottom: 28px; font-size: 15px; } .hero { background: rgba(255,255,255,0.95); padding: 20px; border-radius: 6px; margin-bottom: 24px; } .hero p { color: #555; font-size: 14px; line-height: 1.5; } .upload-section { background: white; border-radius: 8px; padding: 32px; margin-bottom: 24px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); } .upload-area { border: 2px dashed #bdc3c7; border-radius: 8px; padding: 40px; text-align: center; cursor: pointer; transition: all 0.3s; background: #fafbfc; } .upload-area:hover, .upload-area.dragover { border-color: #3498db; background: #ecf0f1; } #fileInput { display: none; } .demo-buttons { margin-top: 20px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; } .demo-btn { padding: 10px 16px; background: #ecf0f1; border: 1px solid #bdc3c7; border-radius: 4px; cursor: pointer; font-size: 13px; transition: all 0.2s; font-weight: 500; } .demo-btn:hover { background: #d5dbdb; } .results { display: none; background: white; border-radius: 8px; padding: 24px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); } .results.visible { display: block; } .result-item { margin-bottom: 28px; padding-bottom: 24px; border-bottom: 1px solid #ecf0f1; } .result-item:last-child { border-bottom: none; } .pdf-name { font-weight: 600; color: #2c3e50; margin-bottom: 12px; } .page-preview { background: #f5f7fa; border: 1px solid #ecf0f1; border-radius: 4px; margin-bottom: 12px; position: relative; max-height: 300px; overflow: auto; display: flex; justify-content: center; align-items: flex-start; padding: 10px; } .page-preview canvas { display: block; max-width: 100%; } .recovered-text { background: #fffacd; padding: 12px; margin: 8px 0; border-radius: 4px; font-family: "Monaco", "Courier New", monospace; font-size: 12px; word-break: break-word; color: #333; border: 1px solid #f0e68c; } .status { padding: 12px 14px; border-radius: 4px; margin: 12px 0; font-size: 14px; font-weight: 500; } .status.leaked { background: #fadbd8; color: #c0392b; border: 1px solid #e74c3c; } .status.clean { background: #d5f4e6; color: #27ae60; border: 1px solid #27ae60; } .loading { color: #7f8c8d; font-size: 14px; padding: 16px; text-align: center; } .error { color: #c0392b; font-size: 14px; padding: 16px; background: #fadbd8; border-radius: 4px; } .no-annotations { color: #95a5a6; font-size: 13px; padding: 12px; background: #ecf0f1; border-radius: 4px; }

Redaction Leak Scanner

Check if your "redacted" PDF actually leaked the text underneath — in your browser, with zero uploads

How your PDF redaction might still be leaking

The problem: Many common redaction methods—black boxes in Preview, Acrobat markup tools, Word exports with strikethrough—don't actually remove the text. They just hide it visually. The text stays in the PDF file underneath, recoverable in seconds.

What this does: This tool extracts all text from your PDF and checks if any of it sits under drawn rectangles or highlight annotations. It shows you exactly what recovered text lives under your redactions. Your file never leaves your computer—everything runs in your browser.

Why this matters: If you're handling legal documents, FOIA requests, or anything with sensitive information, a visual redaction isn't enough. This is why paralegals, records managers, and FOIA officers need to verify redactions before releasing files.

📄 Drop a PDF here or click to upload

Runs entirely in your browser