Oboro

An anonymisation layer between your files and a language model.

Replace the sensitive parts of a document with stable placeholders. Reason about it with a model. Turn the answer back into the real thing.

You have a contract to reason about, and a model that could help. The contract has a client’s name in it, a bank account, a phone number. Pasting it into Claude Code, Copilot, Codex or Cursor sends all of that to somebody else’s computer.

oboro sits in between. It reads the document and replaces the sensitive parts with stable placeholders. It keeps the mapping locally, so you can turn the answer back into the real thing afterwards.

flowchart LR
    A[contract.docx] -->|oboro clean| B[contract.clean.md]
    B --> C{{paste into a model}}
    C --> D[the model's answer]
    D -->|oboro restore| E[answer with real values]
    A -.-> V[(encrypted vault)]
    V -.-> E

    style V stroke-dasharray: 4 4
Figure 1: What happens to a document, and what never leaves the machine.

The name is 朧, Japanese for hazy, or veiled by mist. The tool blurs identifying detail rather than silencing it. The document still reads as a document, and the model can still reason about it.

An agent that reads files itself never waits to be handed a cleaned copy. So in Claude Code, Oboro sits in the tool path instead of in front of it. Two hooks clean what a tool hands the model, and put the real values back into what it writes. See the Quickstart for the four lines of settings.

What it looks like

Marie Lefevre a rencontre le directeur de Sogexia Partners hier.
Son numero est le 06 12 34 56 78.

becomes

[[PERSON_1]] a rencontre le directeur de [[ORG_1]] hier.
Son numero est le [[PHONE_1]].

The same value always becomes the same placeholder. So a model can still tell that two documents mention the same client.

What it reads

Format How
.txt, .md Directly.
.csv, .tsv Directly. The output keeps the tabular extension.
.docx Text runs from the body, headers, footers, footnotes and comments.
.pptx Text from slides, speaker notes and comments.
.eml Headers, every body part, forwarded messages, and attachment names.
.odt The body, headers and footers, annotations, footnotes and image alt text.
.xlsx, .xlsm One TSV file per sheet, named book.<sheet>.clean.tsv.
.pdf Embedded text; a scan needs a build compiled --features ocr.
.png, .jpg, .tif Tesseract, in a build compiled with --features ocr.

What it finds

Rules match structured values. A real check confirms each one, not just a regular expression.

Kind Confirmed by
Email addresses Pattern.
Phone numbers libphonenumber.
IBANs ISO 13616 mod-97 checksum.
Payment cards Luhn checksum, 13 to 19 digits.
SIRET Luhn on both the SIREN prefix and the whole number.
SIREN Luhn checksum.
IP addresses Parsed as IPv4 or IPv6.
Street addresses and postcodes Pattern.
Your own formats Regular expressions you supply.

Names, companies and addresses have no structure to match on. A multilingual recognition model finds them instead. It runs on your machine. See How it works.

Detection does not depend on the document’s language. A file that mixes languages is handled in one pass. Nothing has to be declared. The address patterns carry several languages at once. Two locale hints exist, regions for national phone formats and ocr_languages for images, and both only widen what is read. See Limitations.

WarningRead the output before you send it

No tool of this kind catches everything. This one deliberately errs towards redacting too much rather than too little. Both failures matter. Trusting the output unread fixes neither. See Limitations for the honest account of where it falls short.

Where to go next

Back to top