Prompt Scrub — redact secrets before you send them to an AI | Bruncsoft Bruncsoft How to use it Updates Contact Prompt Scrub · for developers Redact the private parts before you send a prompt to an AI. free Paste your text. The model finds names, passwords, API keys, emails, phone numbers, addresses, IBANs, payment cards and ID numbers and replaces each one with a label. Copy the result and send that to ChatGPT, Claude, or wherever you were going to send it. All of it happens in your own browser . No server of ours, no API key, not a single network request. You cannot ask a cloud model to redact your data before you send the data to a cloud model — which is exactly why this has to run on your machine. Names are found in Czech and English. Passwords, keys, emails, cards and IBANs are found in any language, because those are not words — they are shapes and checksums. Language only matters for people's names . Nothing left your browser. Open devtools → Network. It is empty. The model is in this page. Your text 0 characters Redacted Copy Load an example Clear Nothing found yet. What it looks for Two different jobs done by two different mechanisms, because each is good at something the other is not. Label What it is How it is decided [EMAIL_1] Email address Pattern [PHONE_1] Phone number Pattern + digit count and shape, or context [IBAN_1] Bank account Pattern + mod-97 checksum [CARD_1] Payment card Pattern + Luhn and issuer prefix [BIRTH_NUMBER_1] Czech birth number Pattern + date and mod-11 checksum [API_KEY_1] API key Known prefixes: sk- , ghp_ , AKIA , xoxb- , gsk_ … [JWT_1] JWT token Pattern over the three base64 parts [PRIVATE_KEY_1] Private key BEGIN … PRIVATE KEY block [IPV4_1] IP address Pattern + octet range [URL_CREDENTIALS_1] Login and password inside a URL Pattern [NAME_1] Person's name Trained model [SECRET_1] Password or token with no prefix Trained model [ADDRESS_1] Postal address Context — the words “address”, “adresa”, “bydliště” [ID_1] A number that identifies a person Context — “ID”, “passport”, “IČO”, “account number” Patterns where the shape is verifiable An IBAN, a card and a birth number carry a checksum. That is deterministic — it never guesses, needs no training data and cannot drift. It only validates the shape, not the meaning , so treat it as a filter, not as proof. A model where no pattern exists There is no regex for a person's name. The model learned Czech and English morphology, so it recognises a surname it has never seen before — -ová , -ský , case endings. Shape and context both vote Write api key sk-2oh or tel 45678900 and the word in front of a value helps name it, so a short key is not filed as a generic secret. Every finding reports which signal decided it. Does the number identify a person? That is the line. An order or invoice number is business data and stays put. An ID, passport or company number points at somebody, so it goes — as does anything with a checksum behind it. Labels keep their mapping The same value always gets the same label, so you can put the model's reply back into its original wording with restore() . Using it in your own code One file, no dependencies, runs in Node and in the browser. MIT licensed. // download /prompt-scrub.mjs and import it import { scrub, restore } from './prompt-scrub.mjs'; const { text, found } = scrub(userInput); // text -> 'Hi, my name is [NAME_1], my key is [API_KEY_1]' // found -> [{ label: '[NAME_1]', kind: 'NAME', value: 'Jan Novák', // confidence: 0.98, evidence: 'model' }, …] const answer = await callYourLLM(text); // the model only ever sees labels return restore(answer, found); // put the real values back Every finding carries an evidence field — checksum , pattern , model , cue or cue+model — so you can tell a mod-97-verified IBAN apart from a statistical guess and treat them differently. Download prompt-scrub.mjs Limits, stated plainly Worth reading before you start trusting it. This is not GDPR compliance. It reduces exposure and guarantees nothing. A statistical model has false negatives — read the found list, and keep a human in the loop for anything that matters. The model is public, right here in this page. It has to be — that is what running locally means. Anyone who reads it can craft input that slips past. That is the price of your data never leaving the browser, and we take it knowingly. Names are found in Czech and English only. The model learned the morphology of those two languages and nothing else, so expect markedly worse results elsewhere. Every other category (passwords, keys, emails, phones, cards, IBANs, IPs) is language-independent , because those are not words. A lowercase name is only found after a form of address. “mr dostal” yes, “the customer dostal money back” no — Dostal is both a surname and a common Czech verb, and redacting an ordinary word is a worse failure than missing a name someone typed without a capital. An address is found by its introducing word. An address has no shape a pattern can match, so we look for “address”, “adresa”, “bydliště” or “sídlo” and take the rest of the line. An address written without one of those will be missed. Organisations are not the target. The model looks for people. A company name will usually pass through. Context words only match whole words. “pass” inside “passport” or “tel” inside “hotel” will not trigger anything — cues are compared against entire words, never searched inside them. Phone numbers have no checksum , which makes that the one detector that gets it wrong in both directions. A checksum is not proof. Measured over 20,000 random numbers: Luhn on its own accepts about 10% of 16-digit strings, so an order number would have been redacted as a card. That is why cards are also checked against the issuer prefix and length, which takes it to 2.5% . Birth numbers 1.4%, IBANs 0.9%. If this tool ever tags an order number, that is why. The model is trained on synthetic data (generated names and passwords against a large dictionary of ordinary words). It scores ~99% on its own hold-out, but do not take that number seriously — it measures how separable our generators are, not how it will handle your text. On our own set of realistic sentences (31 names in 8 contexts, 13 paragraphs of prose and code) it finds every name and redacts nothing it should not — but that is a sample we wrote ourselves , not an independent benchmark. What is free and what will cost money Free now No account, no key, forever This page The model itself, MIT licensed Runs locally, connected to nothing We send nothing anywhere, so we pay nothing to run it Paid plan coming The connected one Redact, then send straight to the ChatGPT and Claude APIs The answer comes back with your originals restored Summaries and other operations over the text Connections to your own services and tools For teams: shared rules and an overview Want to know when it lands? Leave an email and we will send updates — mostly about the paid, connected plan. Nothing else, and you can unsubscribe at any time. Send me updates Website © 2026 Bruncsoft™ · bruncsoft.com · Contact Bruncsoft™ is a brand, not a company.