CODEBLACK ON SITE
Comes to your server. Does the job. Leaves. Your documents stay.
For archives that must not leave the house. The same pipeline, the same curator, the same signed decisions, run as a sealed container on a server you own. An extra service, quoted after the inventory.
Nothing of yours moves.
The container does.
- 1Comes to your server.One image, one command, on a server you own.
docker run --rm --network none codeblack/onsite - 2Sealed.No network, enforced twice: by the container and by the runner itself.
self-test: no route out · recorded in the attestation - 3Does the job.Reads the folder where it is. Writes the knowledge base, the report and an attestation next to it.
sha256 of every file read and every file written - 4Only the report travels.You send the handover pack: report, flags, inventory, attestation. Not one line of document text.
handover-pack.zip · a few hundred KB - 5Your decisions.Our curator prepares the questions from the flags; you answer them; you fetch the answered file and apply it on site.
decisions.yaml · applied where the documents are - 6Leaves.The container removes itself. Your documents, your knowledge base and the record stay where they were.
--rm · nothing persists but what was written
Six steps. Four of them are yours, and each is one command.
- You pull one image. The whole pipeline is inside it: the readers for PDF, Word, Excel and PowerPoint, the OCR engine, the cleaning, the chunking, the deduplication, the report. Nothing is fetched at run time.
- You run it with the network off.
docker run --rm --network none, the folder mounted read-only, an output folder, your access key. The runner cuts the network a second time from inside and tests that it has no route out. The result goes into the attestation. - It reads the folder where it is. It writes next to it: the knowledge base before decisions, the processing report, the flag lists, the inventory, and an attestation with the versions and a checksum of every file it read and every file it wrote.
- You send the handover pack. Report, flags, inventory, manifest, attestation: a few hundred kilobytes, and not one line of document text. From any machine with network, or by mail.
- We prepare the decisions, you answer them. The curator builds the questions from the flags alone: which version counts, what is personal, what stays internal. You answer in the portal with a name and a date. You fetch the answered file and apply it on site; the final knowledge base and the decision record are written where the documents are.
- It leaves. The container removes itself. What stays: your documents, untouched; your knowledge base; the record of what was decided; the attestation of what ran.
The paragraph for your data protection officer.
| Stays on your server | Travels, sent by you |
|---|---|
| Your documents, read in place, never copied out | The processing report: counts, file names, what was cleaned and flagged |
| The knowledge base, before and after your decisions | The flag lists: short excerpts around each question, so it can be answered |
| The sampling pack: chunks with page images, yours to share or not | The inventory and the manifest: formats, sizes, versions |
| The decision record and the attestation | The attestation: what ran, sealed or not, the checksums |
The knowledge base leaves only if you later connect it to a hosted assistant, which is a separate decision with its own key. In sealed mode the hosted embedding step is refused by design.
A file you can check, not a claim you must believe.
Every run writes attestation.json: the pipeline and package versions, whether the process was sealed and what the self-test found, the sha256 of every input file and of every file written, and the list of files written. Recompute the hashes on your side and compare. If a single byte differs, you will know.
{
"codeblack": "0.1.0", "pipeline": "1.0.1",
"sealed": true, "network_self_test": "no route out",
"container": true,
"inputs": { "statutes-2023.pdf": "sha256:9f2c…", "members.xlsx": "sha256:41ab…", … },
"outputs": { "output/knowledge_base.jsonl": "sha256:c07e…", "output/processing_report.md": "sha256:…" },
"outputs_written": [ "output/knowledge_base.jsonl", "output/processing_report.md", "output/flags.json", … ]
}
A server with Docker, a folder, a key.
Docker, or Python 3.13
One image, about a gigabyte, with everything inside. Without Docker the same runner installs as a Python package.
A folder and an output folder
The documents are mounted read-only. Everything written lands in the output folder you choose, and nowhere else.
An access key and a person who signs
The key ties the job to your account. The person answers the decisions in the portal; their name goes on the record.
CODEBLACK ON SITE is an add-on to Convert + Curate, quoted after the inventory like everything else. The inventory itself runs on site too, with the same image.