Drop a PDF in, get a WCAG 2.2 / PDF/UA-1 / WTPDF-compliant one back. All local. veraPDF-verified.
1.6K
Drop in any untagged PDF → get back a WCAG 2.2 / PDF/UA-1 (ISO 14289-1) / WTPDF 1.0 Accessibility compliant document. 100% local. No Adobe subscription, no cloud round-trip, no data leaves your network.

docker run -d --name pdf-a11y -p 8000:8000 \
-e VLM_BASE_URL="http://your-vlm-host:1234/v1" \
-e VLM_MODEL="qwen/qwen3-vl-30b" \
-v pdf-a11y-jobs:/data/jobs \
adamopoa/pdf-accessibility:latest
Open http://<host>:8000 — that's the upload form pictured above.
Also published on GitHub Container Registry as
ghcr.io/adamopoulosa1980/pdf-accessibility:latestif you prefer GHCR (no pull-rate limits).
pdf_a11y remediation pipelineopendataloader-pdf structure tagger (local, Apache 2.0)/docs/app/examples/ so you can try it without supplying oneThe only external dependency at runtime is a vision-model endpoint (any OpenAI-compatible server — LM Studio, vLLM, llama.cpp server, Ollama, …) for image alt text. Cloud Anthropic / OpenAI are supported via the config file.
opendataloader tagging → artifact-wrap pass → shared-Form-XObject cleanup → reading-order analysis → table header detection → VLM-driven alt text → form-field labels → contrast remediation → language-of-parts detection → WTPDF profile fixes → veraPDF validation.
On the bundled European Commission A short guide to the EU (36 pages, ~10 MB): veraPDF PDF/UA-1 0/106 failures, veraPDF WTPDF 1.0 Accessibility 0/1723 failures.


Optional Review image descriptions screen lets a non-technical reviewer audit every AI-generated alt text, edit it, or mark images decorative — then re-run with the corrections merged in.

Interactive OpenAPI docs are at /docs:

Endpoints include POST /api/jobs, GET /api/jobs/{id}, GET /api/jobs/{id}/download/{kind}, POST /api/jobs/{id}/refine, and POST /api/test-vlm for VLM-endpoint health checks.
| Tag | Source |
|---|---|
:latest | Most recent GitHub release |
:v2.3, :v2.4, … | Pinned versions — one per GitHub release tag (recommended for production) |
| Var | Default | Purpose |
|---|---|---|
VLM_BASE_URL | http://localhost:1234/v1 | Vision-model server pre-filled in the UI |
VLM_MODEL | qwen/qwen3-vl-30b | Vision-model name pre-filled in the UI |
VLM_API_KEY | (unset) | Deployment-wide VLM API key (used when a user leaves it blank) |
MAX_CONCURRENT_JOBS | 1 | Documents processed in parallel |
JOB_RETENTION_HOURS | 24 | How long finished jobs survive before cleanup |
MAX_UPLOAD_MB | 200 | Upload size cap |
VERAPDF_PATH | /opt/verapdf/verapdf | veraPDF launcher inside the image |
JOBS_DIR | /data/jobs | Where uploads/results live — mount a volume here |
Mount /data/jobs to a named volume (-v pdf-a11y-jobs:/data/jobs) so uploads and results survive container restarts.
Built-in: GET /health → {"status":"ok","verapdf":true}. Docker reports the container as healthy once veraPDF is reachable on the wired-in path.
© 2026 ASSERT I.K.E. — Maintained by Alex Adamopoulos.
Content type
Image
Digest
sha256:c27ae6393…
Size
244.9 MB
Last updated
5 months ago
docker pull adamopoa/pdf-accessibility