Open-source, agent-native audit workpapers for SOX and internal-controls testing. Collect evidence from control owners, let AI test every sampled item against the control's attributes, and keep each judgment anchored to the exact page, cell, or region of the source evidence — nothing becomes a signed workpaper until a human has reviewed it. A self-hostable alternative to spreadsheet-driven controls testing.
Controls testing runs on evidence, and most of that evidence still moves through email threads and spreadsheets where the link between a conclusion and its support quietly breaks. When an AI is added on top of that, the risk compounds: a model that summarizes a population can also hallucinate one.
OpenWorkpapers is built on one rule: every judgment must be traceable to a locator in the source evidence — a PDF page and region, a spreadsheet cell, an OCR bounding box — and every AI verdict stays a suggestion until an auditor confirms it. Run inputs are frozen into hashed manifests, evidence files are content-hash verified, state changes land in an append-only audit trail, and a blind reperformance step re-tests a slice of confirmed judgments without showing the original answer.
| Area | Capability |
|---|---|
| PBC collection | Request evidence from control owners through expiring access links; uploads are sha256-verified before they can enter a run. |
| Deterministic sampling | Random and systematic sampling with frozen seeds; the selection is reproducible from the run's immutable input manifest. |
| Evidence parsing | CSV, XLSX (streaming, cell locators), PDF (page + region coordinates), images (OCR word boxes). Scanned documents can route to an optional GPU parsing service (see services/mineru-service). |
| Approved mappings | Unstructured evidence needs a human-approved source-to-fact mapping before facts feed a judgment; structure changes block the run instead of silently re-guessing. |
| AI judgments | Each sampled item × attribute gets a verdict with confidence, rationale, and an evidence anchor; exceptions require an anchor by contract. |
| Human review | Suggested judgments queue for confirm/reject; policy controls what may auto-merge; blind reperformance re-tests a sample of confirmed work. |
| Sign-off & export | Reviewer return/approve cycles, revisioned sign-offs, watermarked drafts, and Word/ZIP export artifacts with a verifier. |
| BYOK | Bring your own judgment provider endpoint instead of the hosted evaluator. |
Requirements: Docker with Compose.
docker compose up -dThis starts the web app on http://127.0.0.1:3000, the API on :4100, a worker, Postgres, MinIO (S3-compatible object storage), and Mailpit (:8025) for local email. Sign-in links land in Mailpit.
For development against source, see CONTRIBUTING.md.
Text-layer PDFs, spreadsheets, and images parse locally out of the box. To parse scanned PDFs and get higher-quality image OCR, deploy the bundled GPU parsing service to Modal and point the worker at it:
cd services/mineru-service # see its README for secrets and deployment
uv run modal deploy -m mineru_service.modal_appThen set MINERU_ENABLED=true, MINERU_SERVICE_URL, MINERU_SERVICE_API_KEY for the worker and MINERU_CALLBACK_SECRET for the API (see .env.example). Without it, scanned PDFs block with a clear message and images fall back to local Tesseract — nothing degrades silently.
pnpm monorepo:
apps/web— SvelteKit web appapps/api— Fastify API (auth, PBC, runs, judgments, sign-offs, exports)apps/worker— evidence verification, parsing, sampling, judgment pipeline, outbox dispatchpackages/engine— parsers, evidence mapping, sampling, judgment contracts (pure logic)packages/db— Drizzle schema and migrationspackages/domain-sox— SOX control templates and evaluatorspackages/storage— S3-compatible object store client (MinIO, R2, S3)packages/verifier— export artifact verificationservices/mineru-service— optional Modal-deployed MinerU parsing service (Python)
Apache-2.0. See LICENSE.