Parsewall
Make every file inert before it reaches the model.
Quick start · Local install · Offline install · Codex plugin
Parsewall is a deterministic, fail-closed pre-LLM scanner for untrusted uploaded documents. It never asks an LLM to decide whether a document is safe. It parses bounded structures, renders visual formats, compares OCR with embedded text, and returns only this public result contract:
{
"risk_level": "low | review | quarantine",
"evidence": [],
"location": [],
"structural_anomalies": []
}
Even a low result does not make document content trusted. A low-only plain
UTF-8 derivative is prefixed with an untrusted-data marker and must remain data,
never an instruction source.
Install the Python CLI
python -m pip install parsewall
parsewall scan --input ./report.txt
The package also installs parsewall-api, parsewall-worker, and
parsewall-mcp. The original document-firewall* commands remain available as
compatibility aliases.
Use as a GitHub Action
Scan a checked-out document in a workflow. The action fails when the result
reaches the configured fail-on level (quarantine by default).
steps:
- uses: actions/checkout@v4
- uses: gogooma125732/parsewall@v1
id: parsewall
with:
input: path/to/document.pdf
fail-on: review
- run: echo "risk=${{ steps.parsewall.outputs.risk-level }}"
The action installs Parsewall in the runner environment and emits the fixed JSON result contract as an output.
Run the isolated HTTP product
docker compose up --build
curl -F file=@report.pdf http://127.0.0.1:8000/v1/scans
Open http://127.0.0.1:8000/ for the local browser upload interface. It
uploads one supported file, follows the isolated worker status, displays only
the fixed public result fields, and exposes a derivative download only for
low results. The interactive OpenAPI explorer remains at /docs.
For the versioned one-command installation and operational checks, see
deploy/LOCAL_INSTALL.md.
The API only accepts uploads and serves status/results. A separate worker scans jobs with no network, a read-only root filesystem, no Linux capabilities, and bounded CPU, memory, processes, and temporary storage.
Endpoints:
POST /v1/scansGET /v1/scans/{job_id}GET /v1/scans/{job_id}/resultGET /v1/scans/{job_id}/derivative(low results only)
Supported inputs are UTF-8/UTF-16 text, Markdown, HTML, DOCX, PPTX, XLSX, PDF, PNG, and JPEG. Unsupported, corrupt, encrypted, incomplete, or dependency- blocked scans fail closed.
Build distribution artifacts
Build the four distribution channels in order after the versioned Docker image exists locally:
python3 scripts/build_release.py --channel all --clean
Artifacts are written under dist/releases/<version>/ with SHA-256 hashes and
a machine-readable release manifest:
- source-backed Docker Compose local installer (
*-compose.tar.gz); - architecture-specific offline Docker bundle (
*-offline-<platform>.tar); - Python wheel and sdist (
python/); - standalone Codex plugin and local marketplace ZIP files.
Installation details are in deploy/LOCAL_INSTALL.md,
deploy/OFFLINE_INSTALL.md,
deploy/PYTHON_CLI.md, and
deploy/CODEX_PLUGIN.md.
Codex plugin and MCP
The distributable plugin is under plugins/document-injection-firewall. It
contains the inspect-untrusted-files skill, a PreToolUse hook that blocks
local raw-document reads, and an optional root-confined stdio MCP service.
Install the PyPI command and the Git-backed marketplace, then start a new Codex task:
uv tool install parsewall==1.0.0
codex plugin marketplace add gogooma125732/parsewall --ref main
codex plugin add document-injection-firewall@parsewall
Codex's current UserPromptSubmit hook schema exposes prompt text but not an
attachment list, so the hook cannot claim to intercept native attachment
ingestion. It is a local-tool guardrail; the skill and MCP workflow remain the
mandatory pre-read gate.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file parsewall-1.0.0.tar.gz.
File metadata
- Download URL: parsewall-1.0.0.tar.gz
- Upload date:
- Size: 1.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ae9cc0acbd5f8eb8a82787dd31d21e20502906835a6f63aac4e570aaaf5cee6
|
|
| MD5 |
43bcc26c6a00db1ffddee9c0ac9b349a
|
|
| BLAKE2b-256 |
f87b9b12718da51f2cf72e746a5c4f3977346f851bd6f5853e0bc74033bcacdf
|
File details
Details for the file parsewall-1.0.0-py3-none-any.whl.
File metadata
- Download URL: parsewall-1.0.0-py3-none-any.whl
- Upload date:
- Size: 56.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5c0554418c1d65648ad517734147b400fb69ee4673bdf5daca70b7b2e595e925
|
|
| MD5 |
dccba4befd6c7e893ba0cbf763cc998f
|
|
| BLAKE2b-256 |
b413fc629a5e9d28b72614334d0b7cc9de3463569ee01db71719d3f7449da71c
|