The AI data barrier, solved. Anonymize sensitive documents before they reach any AI - then decode the response to restore the real values. 100% offline: nothing ever leaves your machine. Unlike enterprise PII tools built for dev teams (API keys, SDKs, cloud pipelines), promptShield is a desktop app a solo professional installs in two minutes. Detects names, emails, IBANs & more across 7 languages. Free for ever for individuals.
No reviews yetBe the first to leave a review for promptShield
Maker
📌
Hi Product Hunt 👋 I'm a consultant, and promptShield started as a personal itch.
Here's the thing nobody says (out loud): we're all using AI on client work - and we're all quietly downplaying it. For two reasons. One, we have no clean answer for the question "did you just paste my confidential file into ChatGPT?" Two - and this one runs deeper - the old world says an analyst is someone who writes the report. So if the AI wrote it, what are you even for? Admitting AI's role feels like admitting you're a fraud.
But that definition is already dead. In the age of AI, an analyst isn't someone who writes the report - he's someone who vouches for someone else's report, someone else's solution. That's not a smaller job. It's a harder one (just ask managers). It takes more judgment, not less, to stand behind work and own the result in front of a client. The competence didn't go away - it moved.
Once you see it that way, the shame disappears. You're not hiding that you used AI. You're doing the actual job: vouching.
That leaves one real problem - the confidential data. And that one's just… solvable. So I built it.
promptShield strips the names, emails, IBANs and addresses out of a document before anything reaches an AI, then decodes the AI's answer back on your machine so you get the real values. 100% offline - your documents never leave your laptop. No account needed to try it.
The part that surprised me while building: every tool that already does this is aimed at enterprise dev teams - API keys, SDKs, procurement, cloud pipelines. There was nothing for the solo professional at a desk. So that's who this is for. Free for individuals.
Stop hiding how you really work. Keep your edge, and keep your promise to your client. 🛡️
Would genuinely love your feedback - especially from other consultants, lawyers, and small firms.
Report
How does the offline decoding handle cases where the AI's response references the anonymized values in ways you didn't anticipate, like complex relational logic across multiple entities?
Report
Maker
@burcubitgen Tokenization is consistent and 1:1: each value maps to the same stable token everywhere. So the AI sees "[TOKEN_2] is a director of [TOKEN_1], contracted with [TOKEN_5]" and reasons over the real relational graph - the structure rides along in the tokens. Decode is just the reverse lookup on whatever tokens the response echoes.
And entity fuzziness is baked in: docs refer to the same entity inconsistently ("Jane Doe," "J. Doe," "Ms. Doe"), so the review step lets you assign them the same code - they collapse into one actor instead of fragmenting into four unlinked tokens. That's what keeps the logic coherent on a messy real doc.
Limit: decode only restores tokens the model echoes verbatim. If it paraphrases a reference away ("the first party"), there's nothing to map back - but that fails safe: worst case is a placeholder you resolve manually, never a leaked value, since the data never left your machine.
Happy to go deeper on the fuzzy-matching if you're curious 🙂
Report
the offline angle plus decode-the-response is the part that actually makes this usable day to day, most anonymizers stop at the redaction step and leave you to manually restore everything after. question on the decode side though - if the AI paraphrases instead of echoing the placeholder back verbatim, like it refers to "the client mentioned in section 2" instead of repeating the exact token, does decode still catch that and restore the real name, or does it only work when the model quotes the placeholder directly
Report
Maker
@galdayan Hi Gal, good question. Decode is a literal swap: it finds the exact placeholder tokens in the response and puts the real values back. So if the model paraphrases the token away ("the client in section 2" instead of [TOKEN_42]), there's nothing to match and it stays generic - we deliberately don't try to semantically re-identify, so the mapping never guesses.
In practice it rarely bites: tokens read like opaque IDs, so models echo them verbatim rather than reword them out. If a token shows up, it decodes 1:1; if it doesn't, there was nothing to restore. No silent wrong-mapping either way.
Easy to try yourself at app.promptshield.ca - load the demo files, Encode one, run the coded text through any AI, then paste the reply into the Decode tab (once with the token left in, once reworded out). All in-browser, no signup.
Report
@amine_gaaliche "no silent wrong-mapping either way" is the important part of that answer, a decoder that guesses and gets it wrong is worse than one that just fails visibly, since a wrong client name in a report is way harder to catch than a leftover placeholder. makes sense you'd rather lose the rare paraphrase case than risk that. will try the demo flow you described, that's a good way to actually see the failure mode instead of taking your word for it.
Report
Maker
@galdayan Exactly - that was the whole design bet. A visible leftover placeholder is a 2-second fix; a plausible-but-wrong name that ships in a report is the kind of error nobody catches until it's a problem. So we'd always rather fail loud than guess.
Give the demo a go and let me know how it holds up on your own docs — happy to dig in if you hit an edge case.
Report
@amine_gaaliche will do, thanks. one more thing I'm curious about - when it does fail loud, what does that actually look like on the user's end, a hard error that stops the paste, or an obvious placeholder token left in place so it's impossible to miss in the output?
Report
Finally tried this on a contract draft with client names and addresses, and it caught an IBAN I had forgotten was in there. Two minutes from download to running was not an exaggeration.
Report
Maker
@serdarurim This made our day - thanks for putting it through a real contract. 🙏 The forgotten IBAN is exactly the case we built for: it's never the fields you remember, it's the one buried at 11pm before you hit send.
Fun test if you want to prove the offline claim to yourself: flip on airplane mode and run it again - same result, nothing leaves your machine.
And if you ever hit a performance wall with the free offline web app, the desktop app is built for the heavier lifting. Thanks for being the first to take it for a real spin! 🚀
How does the offline decoding handle cases where the AI's response references the anonymized values in ways you didn't anticipate, like complex relational logic across multiple entities?
@burcubitgen Tokenization is consistent and 1:1: each value maps to the same stable token everywhere. So the AI sees "[TOKEN_2] is a director of [TOKEN_1], contracted with [TOKEN_5]" and reasons over the real relational graph - the structure rides along in the tokens. Decode is just the reverse lookup on whatever tokens the response echoes.
And entity fuzziness is baked in: docs refer to the same entity inconsistently ("Jane Doe," "J. Doe," "Ms. Doe"), so the review step lets you assign them the same code - they collapse into one actor instead of fragmenting into four unlinked tokens. That's what keeps the logic coherent on a messy real doc.
Limit: decode only restores tokens the model echoes verbatim. If it paraphrases a reference away ("the first party"), there's nothing to map back - but that fails safe: worst case is a placeholder you resolve manually, never a leaked value, since the data never left your machine.
Happy to go deeper on the fuzzy-matching if you're curious 🙂
the offline angle plus decode-the-response is the part that actually makes this usable day to day, most anonymizers stop at the redaction step and leave you to manually restore everything after. question on the decode side though - if the AI paraphrases instead of echoing the placeholder back verbatim, like it refers to "the client mentioned in section 2" instead of repeating the exact token, does decode still catch that and restore the real name, or does it only work when the model quotes the placeholder directly
@galdayan Hi Gal, good question. Decode is a literal swap: it finds the exact placeholder tokens in the response and puts the real values back. So if the model paraphrases the token away ("the client in section 2" instead of [TOKEN_42]), there's nothing to match and it stays generic - we deliberately don't try to semantically re-identify, so the mapping never guesses.
In practice it rarely bites: tokens read like opaque IDs, so models echo them verbatim rather than reword them out. If a token shows up, it decodes 1:1; if it doesn't, there was nothing to restore. No silent wrong-mapping either way.
Easy to try yourself at app.promptshield.ca - load the demo files, Encode one, run the coded text through any AI, then paste the reply into the Decode tab (once with the token left in, once reworded out). All in-browser, no signup.
@amine_gaaliche "no silent wrong-mapping either way" is the important part of that answer, a decoder that guesses and gets it wrong is worse than one that just fails visibly, since a wrong client name in a report is way harder to catch than a leftover placeholder. makes sense you'd rather lose the rare paraphrase case than risk that. will try the demo flow you described, that's a good way to actually see the failure mode instead of taking your word for it.
@galdayan Exactly - that was the whole design bet. A visible leftover placeholder is a 2-second fix; a plausible-but-wrong name that ships in a report is the kind of error nobody catches until it's a problem. So we'd always rather fail loud than guess.
Give the demo a go and let me know how it holds up on your own docs — happy to dig in if you hit an edge case.
@amine_gaaliche will do, thanks. one more thing I'm curious about - when it does fail loud, what does that actually look like on the user's end, a hard error that stops the paste, or an obvious placeholder token left in place so it's impossible to miss in the output?
Finally tried this on a contract draft with client names and addresses, and it caught an IBAN I had forgotten was in there. Two minutes from download to running was not an exaggeration.
@serdarurim This made our day - thanks for putting it through a real contract. 🙏 The forgotten IBAN is exactly the case we built for: it's never the fields you remember, it's the one buried at 11pm before you hit send.
Fun test if you want to prove the offline claim to yourself: flip on airplane mode and run it again - same result, nothing leaves your machine.
And if you ever hit a performance wall with the free offline web app, the desktop app is built for the heavier lifting.
Thanks for being the first to take it for a real spin! 🚀