Skip to content

0.1.0

Choose a tag to compare

@mcanouil-dev mcanouil-dev released this 22 Jul 11:47
ce1790a

Install

Quick install (script)

curl -fsSL https://m.canouil.dev/oboro/install.sh | bash

# or pin this exact release
curl -fsSL https://m.canouil.dev/oboro/install.sh | bash -s -- --version 0.1.0

The script picks the archive for your machine, verifies it against SHA256SUMS, and installs into /usr/local/bin when writable, otherwise ~/.local/bin.
It needs bash and curl; on a minimal distribution such as Alpine, install them first with apk add bash curl.

Docker

docker volume create oboro-vault
docker run --rm \
  -v oboro-vault:/vault \
  -v "$PWD":/work -w /work \
  --user "$(id -u):$(id -g)" \
  ghcr.io/mcanouil/oboro:0.1.0 clean contract.docx

The vault volume is not optional.
Without it the mapping between placeholders and real values disappears with the container, and the document can never be restored.

A prebuilt binary

Pick the archive for your machine from the table below, then:

VERSION=0.1.0
TARGET=x86_64-unknown-linux-musl   # or whichever row matches

curl -fsSLO "https://github.com/mcanouil/oboro/releases/download/${VERSION}/oboro-${VERSION}-${TARGET}.tar.gz"
curl -fsSLO "https://github.com/mcanouil/oboro/releases/download/${VERSION}/SHA256SUMS"

# Check it is what was published.
sha256sum --ignore-missing --check SHA256SUMS

tar -xzf "oboro-${VERSION}-${TARGET}.tar.gz"
install -m 0755 oboro /usr/local/bin/oboro

On macOS, shasum -a 256 --ignore-missing --check SHA256SUMS does the same job.

With Rust already installed

cargo install --git https://github.com/mcanouil/oboro --tag 0.1.0

From source, with the optional features

The published binaries are the default build.
They read .txt, .md, .docx, .xlsx and text-based .pdf, and find structured values and anything on your denylist.

They do not find names nobody told them about, and they do not read images.
Both need system libraries, so they are compiled in rather than shipped:

cargo build --release --features ner   # names and organisations, then: oboro models pull
cargo build --release --features ocr   # images and scanned pages, needs Tesseract

If names are not being redacted, this is almost certainly why.
oboro doctor reports what any build can do.

To build the optional features without setting up the system libraries on your machine, use the devcontainer, which carries the pinned toolchain, Tesseract and the OCR libraries:

docker build -f .devcontainer/Dockerfile -t oboro-dev .devcontainer
docker run --rm -it -v "$PWD":/work -w /work -u vscode oboro-dev \
  cargo build --release --features "ner,ocr"

In Visual Studio Code or a GitHub Codespace, reopen the folder in the container instead.

Verify what you downloaded

Beyond the checksum, every archive carries build provenance, so you can confirm it came from this repository's workflow and not from somewhere else:

gh attestation verify "oboro-0.1.0-x86_64-unknown-linux-musl.tar.gz" \
  --repo mcanouil/oboro

This tool checks the model it downloads against a pinned hash before using it.
It would be inconsistent to ask you to trust its own binaries on sight.

Which archive is which

Archive For
x86_64-unknown-linux-musl Linux on Intel or AMD. Statically linked, so any distribution, glibc version or Alpine.
aarch64-unknown-linux-musl Linux on ARM, including most cloud instances. Statically linked.
aarch64-apple-darwin macOS on Apple silicon.

There is no Windows build.
The code that creates the vault key readable only by you is Unix-specific, and shipping a build where that quietly does nothing would misrepresent what the tool guarantees.

Documentation

https://m.canouil.dev/oboro/


Changes

Features

  • feat: Replace sensitive values in a document with stable placeholders, so the same value always becomes the same placeholder within a vault.
  • feat: Keep the mapping in a local vault encrypted with AES-256-GCM and indexed by a keyed hash, so the database alone reveals neither the values nor whether a guessed value is present.
  • feat: Bind each placeholder's sequence into the encryption, and create the vault, key and write-ahead-log sidecars owner-only, so a swapped row is detected and the files stay readable only by you.
  • feat: Clean a document to placeholders with clean, and put the real values back into a model's answer with restore, both reading and writing standard input and output.
  • feat: Step through every detection with review, a terminal screen for accepting or rejecting each one before anything is written.
  • feat: Inspect and wipe the mapping with map list and map purge, and report the vault, configuration, supported formats and network use with doctor.
  • feat: Detect emails, phone numbers, IBANs, payment cards, SIREN, SIRET, IP addresses and French addresses, each confirmed by a checksum or parser rather than a pattern alone.
  • feat: Find names, organisations and addresses with a local multilingual recognition model, built with --features ner and fetched by models pull, which verifies downloads against pinned hashes.
  • feat: Configure an allowlist, a denylist and custom identifier patterns through oboro.toml, with accented case folded so an entry such as Société Générale matches SOCIÉTÉ GÉNÉRALE.
  • feat: Read .txt, .md, .docx including its headers, footers, footnotes and comments, .xlsx, and text-based .pdf, plus images through Tesseract when built with --features ocr.
  • feat: Refuse a PDF whose pages yield almost no text, rather than producing output that looks sanitised but was never read.
  • feat: Publish a Docker image, a single static binary on distroless/static with no shell and no network capability, and read the vault and key paths from OBORO_VAULT and OBORO_KEY_FILE so a container can point them at a mounted volume.
  • feat: Install with a script that downloads the prebuilt binary and verifies it against the release checksums, or with prebuilt binaries that carry build provenance you can check with gh attestation verify.